我希望grep搜索两个模式,并为每个匹配输出不同的上下文行:例如,当它匹配“warning”时,输出1行之前和1行之后 - 当它匹配“error”时,输出1前行,后两行;所以我试过了:
$ echo -ne "1\n2\n3\n4\nwarning\n5\n6\n7\n8\nerror\n9\n10\n11\n12\n" | grep -e "warning" -A 1 -B 1 -e "error" -B 1 -A 2
4
warning
5
6
--
8
error
9
10
...但是,不幸的是它不起作用 - 显然,只有最终的-B
/ -A
参数才能实现所有模式。
有没有人知道如何为每种搜索模式实现单独的上下文?
答案 0 :(得分:4)
使用sed
?
sed -n '/warning/{x;p;x;p;n;p};/error/{x;p;x;p;n;p;n;p};h'
其中x
表示交换保留和模式空间的内容,
p
表示打印当前模式空间
n
表示读取模式空间的下一行输入
h
表示复制模式空间以保留空间
sed -n
表示禁止自动打印模式空间(即仅在p
发生时打印)