打印最后一个匹配行

时间:2013-03-12 05:28:43

标签: bash sed

使用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命令(如果存在)。

2 个答案:

答案 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只是在保留空间中保持匹配的行,因此当它到达文件末尾时,它找到的最后一个匹配位于保留空间中。此时,它将保持空间拉入图案空间,然后将其打印出来。