如何仅打印正则表达式最后一次出现的行?

如何仅打印正则表达式最后一次出现的行?

我有一个 (大型) 文件,其中多次出现该表达式SCF Done,而我 (目前) 只对这些行中的最后一行感兴趣。目前,我正在使用管道命令:

sed -n '/SCF Done/p' <filename> | sed '$!d'

我想通过某种方式组合该命令来替换它,但我还无法做到这一点。具体来说,我希望<filename>将其放在最后。有办法吗?

虽然我更喜欢使用 sed 的解决方案,但我也愿意接受其他命令行工具。

答案1

一般来说,每个 sed 命令都使用相同的源数据,并且它们看不到彼此的更改。使用 shell 来管道传输内容时,这不是问题。如果您不想使用 shell 来管道传输输出,那么您必须使用保持缓冲区。

这应该可以实现你想要的效果:

 sed '/SCF Done/h;g;$!d' <filename>

这会将每个匹配项放入保持缓冲区(h)。然后,在读取整个文件后,它会读取保持缓冲区(g)并仅打印最后一行($!d)。

我认为如果您能弄清楚如何让它真正替换每台机器上的整个缓冲区,则可以进一步优化这一点,但我把修复这个问题留给您作为练习。这也将允许您摆脱该;$!d部分。

答案2

仅打印最后一行(或几行),通过管道传输tail -n num_lines

例如只获取最后一行

sed -n '/SCF Done/p' <filename> | sed '$!d' | tail -n 1

相关内容