我有一个 (大型) 文件,其中多次出现该表达式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