grep last match及其';下面几行

grep last match及其';下面几行,grep,match,Grep,Match,我已经学会了如何在比赛前后grep行,以及如何grep最后一场比赛,但我还没有学会如何grep最后一场比赛及其下面的行 该场景是一个服务器日志。 我想列出命令的动态输出。该命令可能在一个服务器日志中使用多次。因此,我设想匹配将是命令,并且不知何故,grep可以使用-A和其他标志或尾部命令的变体来完成我正在寻找的结果。使用awk代替: awk '/pattern/{m=$0;l=NR}l+1==NR{n=$0}END{print m;print n}' foo.log 小测试,找到与/8/匹配的

我已经学会了如何在比赛前后
grep
行,以及如何
grep
最后一场比赛,但我还没有学会如何
grep
最后一场比赛及其下面的行

该场景是一个服务器日志。 我想列出命令的动态输出。该命令可能在一个服务器日志中使用多次。因此,我设想匹配将是命令,并且不知何故,
grep
可以使用
-A
和其他标志或尾部命令的变体来完成我正在寻找的结果。

使用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

我将采用这种方法来解决这个问题,因为找到第一个匹配项并打印上下文行更容易。以文件为例:

$ cat file
foo
1
2
foo
3
4
foo
5
6
假设我们想要最后一个匹配的
foo
和下面的
,我们可以使用
tac
反转文件,找到第一个匹配,并使用
-Bn
找到上面的
n
行,然后停止使用
-m1
。然后简单地用tac重新反转输出:

$ tac file | grep foo -B2 -m1 | tac
foo
5
6
tac
rev
这样的工具可以使看似困难的问题变得容易得多