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

发布于 2024-11-08 03:41:01 字数 389 浏览 0 评论 0原文

我希望 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 参数对所有模式都有效。

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

I want grep to search for two patterns, and output different lines of context for each match: e.g, when it matches "warning", output 1 line before and 1 line after - and when it matches "error", output 1 line before, and 2 lines after; so I tried this:

$ 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

... however, unfortunately it doesn't work - apparently, only the final -B/-A arguments are effectuated for all patterns.

Does anyone have an idea how to achieve separate context for each search pattern?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仅冇旳回忆 2024-11-15 03:41:01

使用 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时打印)

What about this variant using sed?

sed -n '/warning/{x;p;x;p;n;p};/error/{x;p;x;p;n;p;n;p};h'

Where x means Exchange the contents of the hold and pattern spaces,
p means Print the current pattern space
n means Read the next line of input into the pattern space
h means Copy pattern space to hold space
sed -n means suppress automatic printing of pattern space (i.e. print only when p occurs)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文