2013-03-12 93 views
1

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

回答

3

这很简单,这些都是在每一行(循环)运行三个独立命令:

  • h命令替换当前保持缓冲器用含有out_time=每一行。
  • $!d删除任何不是最后一行的行并重新启动下一个周期。
  • x命令交换保持和模式缓冲区。

的效果是,最终out_time=线被放置在保持缓冲器,并通过所述过滤器$!d逸出的唯一线(该文件的最后一行)被交换与印刷之前保持缓冲器。

认为它是大意如下的程序:

grep 'out_time=' progress.txt | tail -1 

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 

当然可以,如果你有合适的工具的工作来避免整个过程折磨

0

我想这可以被认为是简单的:

sed -n '/out_time=/h; ${x;p;}' progress.txt 

也可写成:

sed -n '/out_time=/h; $x; $p' progress.txt 

在所有这些,sed只是持有保留空间匹配行,所以当它到达文件末尾时,它发现的最后一个匹配在保持空间中。此时,它将保持空间拉入图案空间,然后进行打印。