具有多个上下文的多个模式?

时间:2011-05-18 08:16:04

标签: design-patterns grep

我希望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参数才能实现所有模式。

有没有人知道如何为每种搜索模式实现单独的上下文?

1 个答案:

答案 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发生时打印)