![計數日誌檔案中的錯誤訊息](https://rvso.com/image/192214/%E8%A8%88%E6%95%B8%E6%97%A5%E8%AA%8C%E6%AA%94%E6%A1%88%E4%B8%AD%E7%9A%84%E9%8C%AF%E8%AA%A4%E8%A8%8A%E6%81%AF.png)
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:1
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:2
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:5
java.lang.NullPointerException:12
java.lang.NullPointerException:7
java.lang.NullPointerException:18
java.lang.NullPointerException:2
正如你所看到的,我有 3 個重複的 mysql 錯誤,它們的頻率出現在最後。在第一個錯誤上,它顯示為 1,在第二個錯誤上,它顯示為 2,在第三次錯誤上,它顯示為 5。對 java 錯誤執行相同的操作。
預期輸出:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:8
java.lang.NullPointerException:39
答案1
awk 'BEGIN{ FS=OFS=":" }
{ freq=$NF; sub(/:[^:]*$/, ""); seen[$0]+=freq }
END{ for (x in seen) print x, seen[x] }' infile
FS是輸入欄位分隔符,OFS是輸出欄位分隔符;我們都設定為冒號;然後我們將最後一個欄位放入$NF
臨時變數中freq
,然後$0
使用 sub() 函數從目前輸入記錄中刪除最後一個欄位。
透過這樣做,seen[$0]+=freq
我們對最後一個欄位的值總結相同的日誌行(最後一個欄位已被排除),作為我們freq
先前在變數中保存的頻率。
然後在最後,我們循環遍歷數組並列印各行,然後列印它們的總頻率。