查找最后匹配的内容及其后面的行

9
我学会了如何用grep命令搜索匹配项之前和之后的行,以及如何搜索最后一个匹配项,但我还没有找到如何搜索最后一个匹配项并且其下面的行的方法。
场景是服务器日志。我想列出一个动态输出,需要从一个命令中获得。这个命令可能在同一台服务器日志中使用多次。因此,我想匹配的是该命令,并希望grep命令可以使用-A和其他标志或变化的tail命令,来完成我想要的结果。
2个回答

15

我会采用反向思考的方法,因为这样更容易找到第一个匹配项并打印出上下文。拿这个文件举例:

$ cat file
foo
1
2
foo
3
4
foo
5
6

如果我们想要在lines中找到foo的最后一次匹配,我们可以使用tac反转文件,使用-Bn找到第一个匹配项和上面的n行,使用-m1停止。然后再使用 tac 简单地反转输出:

$ tac file | grep foo -B2 -m1 | tac
foo
5
6

tacrev这样的工具可以让看起来很难的问题变得更加容易。


1
使用awk代替:
awk '/pattern/{m=$0;l=NR}l+1==NR{n=$0}END{print m;print n}' foo.log

小测试,找到最后一行匹配/8/的行,并且它的下一行:

kent$  seq 20|awk '/8/{m=$0;l=NR}l+1==NR{n=$0}END{print m;print n}'
18
19

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接