从日志中提取唯一条目

时间:2013-12-18 13:05:55

标签: shell unix sed awk grep

我有一个日志文件,它按以下格式打印出行:

ERROR [10 Dec 2013 03:57:07] ........ Project ID: [88000317019]......

我想计算出错误的唯一项目ID的数量 每个项目ID可能会多次发出错误。

我该怎么做?

4 个答案:

答案 0 :(得分:3)

您可以使用:

awk -F[][] '/ERROR/ {a[$4]++} END{for (i in a) print i, a[i]}' file

解释

  • -F[][]设置[]作为可能的字段分隔符。
  • /ERROR/ {a[$4]++}创建一个值为a[ key1 ]=num_of_ocurrences_key1, a[ key2 ]=num_of_ocurrences_key2等的数组。$4被使用,因为它是出现在[]括号内的文本,并使其成为第4个位置。 /ERROR/会过滤包含文字ERROR
  • 的行
  • END{for (i in a) print i, a[i]}打印结果。

测试

$ cat a
ERROR [10 Dec 2013 03:57:07] ........ Project ID: [88000317019]......
ERROR [10 Dec 2013 03:57:07] ........ Project ID: [88000317019]......
WARNING [10 Dec 2013 03:57:07] ........ Project ID: [88000317019]......
ERROR [10 Dec 2013 03:57:07] ........ Project ID: [88000317013]......
WARNING [10 Dec 2013 03:57:07] ........ Project ID: [88000317010]......

$ awk -F[][] '/ERROR/ {a[$4]++} END{for (i in a) print i, a[i]}' a
88000317019 2
88000317013 1

答案 1 :(得分:2)

这适用于您要查找的部分之前和之后的任何内容,用于记录ERROR的那些行:

$ cat file                                                                     
.............Project ID: [xyz] ERROR...........
.............Project ID: [abc] INFO............
.............Project ID: [abc] ERROR...........
.............Project ID: [xyz] WARNING.........
.............Project ID: [xyz] ERROR...........

$ grep -Po '(?<=Project ID: [[])[^]]+(?=[]] ERROR)' file | sort | uniq -c        
      1 abc
      2 xyz

注意:需要GNU grep

答案 2 :(得分:0)

您可以尝试:

awk '
{
   match($0,/\[(.*)\]/,a)
   id[a[1]]++
}
END {
   for(i in id) 
      q++
   print "Number of unique ids: " q
}' log.file

答案 3 :(得分:0)

其他方式。

sed -n '/ERROR/ s/.*\[//;s/\].*//p' infile|sort |uniq -c |sort -n