打印最后一个匹配的行?

6

使用 awk,我想要打印文件中最后一行匹配的内容。 我只需要匹配的那一行,不需要任何其他行。 可以使用以下命令:

awk '/foo/' bar.txt

然而,这将打印所有匹配的行,而不仅仅是最后一行。
5个回答

31
您可以将值保存在变量中,然后在处理整个文件后打印它:
awk '/foo/ {a=$0} END{print a}' file

测试

$ cat file
foo1
foo2
foo3
4
5
$ awk '/foo/ {a=$0} END{print a}' file
foo3

真棒的解决方案! - desgua

6

sed 解决方案:

sed -n '/foo/h;$!b;g;p' bar.txt

将匹配的正则表达式放在暂存缓冲区,并进行分支。重复这个过程直到文件末尾。当到达文件末尾时,从保留空间中获取该行并将其放置在模式空间中。打印模式空间。

6

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

tac file | awk '/foo/ {print; exit}'

2
这意味着不需要先前的上下文来确定要打印哪些行。 - Ignacio Vazquez-Abrams
3
嗯,我突然想到你也可以用“tac file | grep -m1 foo” 这个命令来实现,这可能更好一些,因为它更简洁,并且在我看来同样清晰明了。不过并非所有的grep命令都适用,这可能只适用于GNU grep。 - Ed Morton
tac $file | grep $pattern | tac | tail -n $N -- 按顺序保留最后N行匹配文本的输出 - Дмитрий Кулешов

5

tail 命令允许您检索输入流的最后 n 行。您可以将您的 awk 输出管道到 tail 中,以便除了最后一行之外,其它内容都被修剪掉:

awk '/foo/' bar.txt | tail -1

没有管道,将该行存储并在 END 中打印。 - Ignacio Vazquez-Abrams

2
你可以给变量赋值,并在处理完行和它们的行号后将它们打印出来。
文件:
$ cat file
foo1
foo2
foo3
4
5

命令:

$ awk '/foo/ {a=$0;n=NR} END{print n, a}' file
3 foo3

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