如何查找最后一次出现的模式并打印最后一次出现后的所有行

如何查找最后一次出现的模式并打印最后一次出现后的所有行

我有一个包含多次出现的模式的文件“====”。这些模式后面跟着文本。我想搜索最后一次出现的“====”图案并打印图案后的所有线条。关于如何在 bash 中做到这一点有什么想法吗?grepawksed或等的组合tail

样本文件:

====

First run of script

End of first Script

====

2nd run of script

End of 2nd script

====

3rd run of script

End of 3rd script

该命令的输出应如下所示。

3rd run of script

End of 3rd script

答案1

与 agc 的答案相同的概念,但不需要您猜测可能有多少行:

使用 GNU sed

tac file | sed '/====/Q' | tac

或 awk

tac file | awk '/====/ {exit} 1' | tac

double 的想法tac是反转问题:如何打印所有行第一的模式的发生。这是一个简单得多的问题。

答案2

软件工具方法,对于大文件更有效,因为它只读取文件末尾,然后在找到最后一个匹配时停止:

tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac

注意:999999根据需要增加或减少,使其比任何可能的匹配都长。如果事先知道最后一个匹配项接近大文件的末尾,则此代码将工作得最好。也可以看看格伦·杰克曼的答案awk以及 和的变体sed这避免了需要999999.对于资源非常少的系统,比或grep更有效。awksed

为了避免猜测,添加一些stat丑陋的东西会起作用:

f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac

答案3

基于所以重复:

$ sed -n '/====/h;//!H;$!d;x;//p' sample.txt 
====

3rd run of script

End of 3rd script

Output of the command should look like below.

3rd run of script

End of 3rd script

我开始写一个解释,但我实际上并不理解一些命令,所以我只是参考info sed.

答案4

保存文本file.txt并运行以下命令:

awk 'p; /====/ $p' file.txt | tail -3

输出:

3rd run of script

End of 3rd script

相关内容