如何使用bash筛选多匹配模式,仅为指定模式输出其前一行
解决方案
你遇到的问题是grep -B N会为每一个匹配到的行统一输出前N行,无法单独控制仅为特定匹配行输出上下文,这里提供几个不同适用场景的可行方案:
方案1:明确指定要额外输出前一行的匹配项
如果你清楚知道只有line4需要输出前一行,其他匹配项不需要,直接用单行awk命令即可:
awk 'NR==1{prev=$0;next} { if($0=="line2" || $0=="line6") print $0; else if($0=="line4") {print prev; print $0} } {prev=$0}' 你的文件名
直接运行就能得到你要的输出结果:
line2 line_before line4 line6
方案2:通用多模式匹配,可自定义哪个匹配项输出前一行
如果后续匹配规则可能调整,比如要新增匹配模式、要换其他匹配项输出前一行,可以用更灵活的awk实现:
awk ' BEGIN { # 在这里添加所有你要匹配的模式 target["line2"] = 1 target["line4"] = 1 target["line6"] = 1 # 定义第几个匹配项需要输出前一行,这里line4是第2个匹配到的,所以填2 need_prev_line_num = 2 } { if ($0 in target) { match_cnt++ if (match_cnt == need_prev_line_num) print prev print $0 } prev = $0 }' 你的文件名
方案3:临时快速实现,用多grep拼接
如果只是临时处理一次,不想写awk逻辑,也可以直接组合多个grep命令过滤结果:
{ grep '^line2$' 你的文件名; grep -B1 '^line4$' 你的文件名 | grep -v '^--$'; grep '^line6$' 你的文件名; }
这个命令会自动过滤掉grep输出的上下文分隔符--,得到你要的结果。
内容的提问来源于stack exchange,提问作者mbrother
相关产品推荐
相关产品推荐

