我有一个包含多次出现的模式的文件“====”。这些模式后面跟着文本。我想搜索最后一次出现的“====”图案并打印图案后的所有线条。关于如何在 bash 中做到这一点有什么想法吗?grep
、awk
、sed
或等的组合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
更有效。awk
sed
为了避免猜测,添加一些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