2013-03-12 92 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只是持有保留空間匹配行,所以當它到達文件末尾時,它發現的最後一個匹配在保持空間中。此時,它將保持空間拉入圖案空間,然後進行打印。