使用sed
,我想打印文件的最后一个匹配行。我遇到了
sed: return last occurrence match until end of file
然而,我只希望匹配线本身,而不是任何线条范围。使用该页面,我实际上想出了一个工作命令
$ sed '/out_time=/h; $!d; x' progress.txt
out_time=00:00:07.720000
问题是为什么这样做,或者用另一种方式说明这个命令中发生了什么。还包括一个更简单的sed
命令(如果存在)。
答案 0 :(得分:4)
很简单,这些是在每一行(循环)上运行的三个独立命令:
h
命令用包含out_time=
的每一行替换当前保持缓冲区。$!d
删除任何不是最后一行的行并重新开始下一个周期。x
命令交换保持和模式缓冲区。结果是最后的out_time=
行放在保持缓冲区中,并且通过$!d
过滤器(文件的最后一行)转义的唯一行与该保持缓冲区交换在打印之前。
将其视为一个程序,包括以下几行:
for every line in file:
if line contains "out_time=":
holdbuff = line
if line is not last line of file:
continue for loop
swap line and holdbuff
print line
当然,如果您拥有正确的工具,可以避免整个折磨过程:
grep 'out_time=' progress.txt | tail -1
答案 1 :(得分:1)
我认为这可能被认为更简单:
sed -n '/out_time=/h; ${x;p;}' progress.txt
也可以写成:
sed -n '/out_time=/h; $x; $p' progress.txt
在所有这些中,sed
只是在保留空间中保持匹配的行,因此当它到达文件末尾时,它找到的最后一个匹配位于保留空间中。此时,它将保持空间拉入图案空间,然后将其打印出来。