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

时间:2017-06-22 09:57:27

标签: bash shell awk

我希望得到基于部分字符串的唯一计数但是在计数整个字符串之后应该显示

示例日志:

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 

1 个答案:

答案 0 :(得分:0)

使用您现有的方法打印找到的第一行以及方括号内的内容的数量:

zcat your.log.gz | awk -F'[][]' '
  !($2 in c) {c[$2]=$0}
  {a[$2]++}
  END {for(i in c){printf "%4d %s\n",a[i],c[i]}}
'

这里的逻辑是c[]数组将存储内容的第一次出现,a[]数组用作错误的计数器。 END块遍历数组(要么共享索引),打印计数和内容。请注意,此输出不一定与输入的顺序相同,但您尚未指定作为要求。

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