Awk

過濾掉tail -f的重複行

  • May 11, 2016

我經常需要為網站跟踪 -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

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