我想在字符串的一部分的基础上获得唯一计数,但在计数后应该显示整个字符串
示例日志:
Error [VALIDATION_ERROR_OFFER_ALREADY_EXISTS] Code [VAL-00019] Message
Error [VALIDATION_ERROR_OFFER_NOT_EXISTS] Code [VAL-00023] Message [Offer
Error [WEB_SERVICE_CLIENT_INITIALIZATION_FAILED] Code [WS-00001] Message [Error while initializing CBCM Web Service Client.]
现在在 [] 之间的第一部分的基础上,我想在谁的日志文件中获取计数,但所有行中的第一行应该完整显示
zgrep -h 'Error' my.log|awk -F'[][]' '{print $2}'|sort| uniq -c
以上仅打印
3 VALIDATION_ERROR_OFFER_ALREADY_EXISTS
1 VALIDATION_ERROR_OFFER_NOT_EXISTS
5 WEB_SERVICE_CLIENT_INITIALIZATION_FAILED
但是我正在寻找计数后它显示一个完整的样本行,例如
3 Error [VALIDATION_ERROR_OFFER_ALREADY_EXISTS] Code [VAL-00019] Message
这会使用现有方法打印找到的第一行以及方括号内的内容计数:
zcat your.log.gz | awk -F'[][]' '
!($2 in c) {c[$2]=$0}
{a[$2]++}
END {for(i in c){printf "%4d %sn",a[i],c[i]}}
'
这里的逻辑是,c[]
数组将存储内容的首次出现,a[]
数组充当错误的计数器。END
块逐步执行数组(两者都可以,因为它们共享索引(、打印计数和内容。请注意,此输出的顺序不一定与输入相同,但您尚未将其指定为要求。
如果您愿意,可以将其设置为单个命令行。我把它摊开以便于阅读。