计数日志文件中的错误消息

计数日志文件中的错误消息
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之前在变量中保存的频率。

然后在最后,我们循环遍历数组并打印各行,然后打印它们的总频率。

相关内容