【发布时间】:2013-09-17 19:00:22
【问题描述】:
我已经学会了如何在比赛之前和之后grep 线和最后一场比赛grep,但我还没有发现如何grep 最后一场比赛和它下面的线。
场景是服务器日志。
我想列出命令的动态输出。该命令可能会在一个服务器日志中多次使用。所以我想匹配将是命令,并且grep 可以以某种方式将-A 与其他一些标志或尾部命令的变体一起使用,以完成我正在寻找的结果。
【问题讨论】:
我已经学会了如何在比赛之前和之后grep 线和最后一场比赛grep,但我还没有发现如何grep 最后一场比赛和它下面的线。
场景是服务器日志。
我想列出命令的动态输出。该命令可能会在一个服务器日志中多次使用。所以我想匹配将是命令,并且grep 可以以某种方式将-A 与其他一些标志或尾部命令的变体一起使用,以完成我正在寻找的结果。
【问题讨论】:
我会采用这种方法来扭转问题,因为它更容易找到第一个匹配项并打印上下文行。拿文件:
$ cat file
foo
1
2
foo
3
4
foo
5
6
假设我们想要foo 的最后一个匹配项和下面的lines,我们可以使用tac 反转文件,使用-Bn 找到第一个匹配项和上面的n 行并停止使用@987654327 @。然后简单地用 tac 重新反转输出:
$ tac file | grep foo -B2 -m1 | tac
foo
5
6
tac 和rev 之类的工具可以让看似困难的问题变得更容易。
【讨论】:
改用 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
【讨论】: