design-patterns - 具有多个上下文的多个模式?

标签 design-patterns grep

我希望 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/

相关文章:

javascript - 应该查看触发事件吗?

design-patterns - 你见过的最有趣的设计模式是什么?

java - 面向对象设计模式 : How to add methods dynamically?

linux - 如何选择未注释的行?

linux - 在 Linux 中获取自定义记录器的日期差异

c# - 如何在我的业务逻辑层中管理统一性?

java - 需要一种优雅的方式在指定的时间间隔内调用任意代码

bash - 为什么 grep 在脚本或命令行中使用时会产生不同的结果 - 在尝试查找 pid 时?

bash:如果 grep 管道选择任何行则退出

linux - 使用 grep 和 awk 将文件的第一列转换为 unixtime