我有一个日志文件,它按以下格式打印出行:
ERROR [10 Dec 2013 03:57:07] ........ Project ID: [88000317019]......
我想计算出错误的唯一项目ID的数量 每个项目ID可能会多次发出错误。
我该怎么做?
答案 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