如何用grep/sed/awk实现首行匹配内容出现在次行时输出两行?
解决跨行匹配问题的两种方案
我来帮你搞定这个问题!你需要的是匹配连续两行,其中前一行里冒号后的三个大写字母(也就是(?<=:)[A-Z]{3}匹配的内容)出现在后一行里,对吧?之前用grep -A1 -P搞不定很正常,因为grep本身不太擅长保存上一行的匹配结果来关联下一行。这里给你两个可行的方案:
方案一:用AWK处理(跨平台,默认自带)
AWK天生适合处理这种逐行关联的逻辑,而且对百万行的大文件性能也很好。直接用下面的一行命令:
awk '{if(prev!=""){if($0~t){print prev;print $0}}} {match($0,/:([A-Z]{3})/,m);t=m[1];prev=$0}' your_file.txt
工作原理:
- 首先判断
prev(上一行内容)是否为空,不为空时检查当前行是否包含上一行捕获的目标字符串t - 如果符合条件,就输出上一行和当前行
- 每一行都会用
match函数提取冒号后的三个大写字母,保存到t中,同时把当前行内容存到prev里,供下一行判断使用
方案二:用pcregrep(更简洁,需额外安装)
如果你的系统支持pcregrep(很多Linux发行版需要安装pcre-tools包,macOS可通过brew安装),可以用多行匹配模式直接搞定:
pcregrep -M '^.*:([A-Z]{3}).*\n.*\1.*' your_file.txt
工作原理:
-M参数启用多行匹配模式,允许正则表达式跨越多行^.*:([A-Z]{3}).*匹配任意行,捕获冒号后的三个大写字母到分组1\n匹配换行符,.*\1.*匹配下一行包含分组1中捕获的字符串- 整个模式会直接匹配并输出符合条件的连续两行
内容的提问来源于stack exchange,提问作者RD Ward
相关产品推荐
相关产品推荐

