Awk
過濾掉tail -f的重複行
我經常需要為網站跟踪 -f apache 訪問日誌以解決問題 - 令人討厭的一件事是任何人載入一個頁面一次可能會導致 12 行以上的行被寫入日誌,並且因為它們每一行都是很長的行在我的終端中包含多行。
tail -f 似乎與 grep 和 awk 的管道配合得很好,我想出了一個非常簡單的解決方案,當一個 IP 地址在特定秒內發出許多請求時過濾掉重複項(以及將其修剪為我通常使用的特定資訊需要)-
尾 -f 日誌文件 | awk ’ { 列印 $ 1 " " $ 4 " " $9}’ | 獨特的
問題是,這行不通。我根本沒有輸出,即使我知道應該列印很多行。
我嘗試了一些故障排除,但無法讓事情真正發揮作用-
tail -f log.file | awk ' { print $1 " " $4 " " $9}'
這完全按照我的想法工作,並在發生時列印行(但有很多重複項),如下所示:
12.34.56.78 [10/May/2016:18:42:01 200 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304 12.34.56.78 [10/May/2016:18:42:02 304
tail log.file | awk ' { print $1 " " $4 " " $9}' | uniq
這也完全按照我的想法工作,並過濾掉任何重複的行。但對於我的故障排除,我真的需要實時更新
tail -f
如何
tail -f
過濾掉重複的行?
作為純 awk 解決方案,請嘗試:
tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'
僅當輸入行與前一個輸入行不同時,才列印新的輸出行。
作為一個細微的變化,僅當此輸出行與先前的輸出行不同時,此輸出行才會列印新的輸出行:
tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'
例子
讓我們試試這個測試文件:
$ cat logfile 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 11 1 2 3 4 5 6 7 8 19 1 2 3 4 5 6 7 8 19 12 1 2 3 4 5 6 7 8 19 13 1 2 3 4 5 6 7 8 19 1 2 3 4 5 6 7 8 29
awk 過濾掉重複的輸出行:
$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}' 1 4 9 1 4 19 1 4 29