我希望 grep 搜索两种模式,并为每个匹配输出不同的上下文行:例如,当它匹配“警告”时,输出前 1 行和后 1 行 - 当匹配“错误”时,输出前 1 行,和 2 行之后;所以我试过这个:
$ 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
参数适用于所有模式。有没有人知道如何为每个搜索模式实现单独的上下文?
最佳答案
这个使用 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
时打印)
关于design-patterns - 具有多个上下文的多个模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6041720/