Text-Processing
grep 從文件末尾到開頭
我有一個包含大約 30.000.000 行的文件(Radius Accounting),我需要找到給定模式的最後一個匹配項。
命令:
tac accounting.log | grep $pattern
給出了我需要的東西,但它太慢了,因為作業系統必須先讀取整個文件然後發送到管道。
所以,我需要一些快速的東西,可以從最後一行讀取文件到第一行。
tac
僅當您還使用grep -m 1
(假設 GNUgrep
)grep
在第一次比賽后停止時才有幫助: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