打印最后一个匹配行?

1 bash awk

使用awk,我想打印文件的最后一个匹配行.我想只匹配线本身,而不是任何线条范围.我可以使用这样的命令

awk '/foo/' bar.txt
Run Code Online (Sandbox Code Playgroud)

但是,这将打印所有匹配的行,而不仅仅是最后一行.

fed*_*qui 21

您可以将值保存在变量中,然后在处理完整个文件后将其打印出来:

awk '/foo/ {a=$0} END{print a}' file
Run Code Online (Sandbox Code Playgroud)

测试

$ cat file
foo1
foo2
foo3
4
5
$ awk '/foo/ {a=$0} END{print a}' file
foo3
Run Code Online (Sandbox Code Playgroud)


jay*_*ngh 6

sed 解决方案:

sed -n '/foo/h;$!b;g;p' bar.txt
Run Code Online (Sandbox Code Playgroud)

将匹配regex放在保持缓冲区中并分支出来。继续这样做直到文件结束。当到达文件末尾时,从保持空间中抓取该行并将其放置在模式空间中。打印模式空间。


Ign*_*ams 5

该命令tail允许您检索n输入流的最后几行.你可以awk输出你的输出tail,以便删除除最后一行之外的所有内容:

awk '/foo/' bar.txt | tail -1
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

反转文件并找到第一个匹配项。

tac file | awk '/foo/ {print; exit}'
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我突然想到你也可以用`tac file | 来做到这一点。grep -m1 foo` 这样可能会稍微好一点,因为它更简洁,恕我直言同样清晰。虽然不适用于所有 grep,但它可能是特定于 GNU grep 的。 (3认同)
  • 这假设不需要更早的上下文来确定要打印的行。 (2认同)