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

use*_*223 5 text-processing

我有一个文件,其中包含多次出现的模式"===="。这些模式之后是文本。我想搜索“====”模式的最后一次出现并打印该模式后的所有行。关于如何在 bash 中做到这一点的任何想法?grepawksedtail等的组合?

示例文件:

====

First run of script

End of first Script

====

2nd run of script

End of 2nd script

====

3rd run of script

End of 3rd script
Run Code Online (Sandbox Code Playgroud)

命令的输出应如下所示。

3rd run of script

End of 3rd script
Run Code Online (Sandbox Code Playgroud)

gle*_*man 7

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

使用 GNU sed

tac file | sed '/====/Q' | tac
Run Code Online (Sandbox Code Playgroud)

或 awk

tac file | awk '/====/ {exit} 1' | tac
Run Code Online (Sandbox Code Playgroud)

双精度的想法tac是反转问题:如何打印第一次出现模式之前的所有行。这是一个简单得多的问题。


agc*_*agc 5

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

tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Run Code Online (Sandbox Code Playgroud)

注意:999999根据需要增加或减少,只是为了比任何可能的匹配都长。如果事先知道最后一个匹配项接近大文件的末尾,则此代码将最有效。另请参阅Glenn Jackman的回答,awksed其中包含避免需要999999. 对于资源非常少的系统,grepawkor更有效sed

为了避免猜测,一些额外的stat丑陋会起作用:

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


l0b*_*0b0 4

基于SO重复

$ 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
Run Code Online (Sandbox Code Playgroud)

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