在字符串的一部分的基础上获得唯一,但应打印整个字符串



我想在字符串的一部分的基础上获得唯一计数,但在计数后应该显示整个字符串

示例日志:

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块逐步执行数组(两者都可以,因为它们共享索引(、打印计数和内容。请注意,此输出的顺序不一定与输入相同,但您尚未将其指定为要求。

如果您愿意,可以将其设置为单个命令行。我把它摊开以便于阅读。

最新更新