Text-Processing

grep 從文件末尾到開頭

  • August 1, 2017

我有一個包含大約 30.000.000 行的文件(Radius Accounting),我需要找到給定模式的最後一個匹配項。

命令:

tac accounting.log | grep $pattern

給出了我需要的東西,但它太慢了,因為作業系統必須先讀取整個文件然後發送到管道。

所以,我需要一些快速的東西,可以從最後一行讀取文件到第一行。

tac僅當您還使用grep -m 1(假設 GNU grepgrep在第一次比賽后停止時才有幫助:

tac accounting.log | grep -m 1 foo

來自man grep

  -m NUM, --max-count=NUM
         Stop reading a file after NUM matching lines.  

在您問題的範例中,兩者都tac需要grep處理整個文件,因此使用tac是毫無意義的。

因此,除非您使用grep -m,否則根本不要使用tac,只需解析 的輸出grep以獲取最後一個匹配項:

grep foo accounting.log | tail -n 1 

另一種方法是使用 Perl 或任何其他腳本語言。例如(其中$pattern=foo):

perl -ne '$l=$_ if /foo/; END{print $l}' file

或者

awk '/foo/{k=$0}END{print k}' file

引用自:https://unix.stackexchange.com/questions/112159