我的Tomcat日志以这种格式构建:
[<DATE>] [<COMPONENT>] ERROR_TYPE <ERROR_NAME> - <Rest of line>
ERROR_TYPE
DEBUG
ERROR
或[18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ...
[18/Jul/2012:09:54:32 +0000] [component2] DEBUG IPNotFound - ...
[18/Jul/2012:09:54:32 +0000] [component1] TRACE Connected - ...
[18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ...
。
如,
(ERROR_TYPE, ERROR_NAME)
我想创建一个从元组ERROR ConnectionTimeOut 2
DEBUG IPNotFound 1
TRACE Connected 1
到出现次数的映射,例如
_anything_ (ERROR|DEBUG|TRACE|WARN|FATAL_spaces_ _another_word_)_anything_
我如何匹配以下内容:
{{1}}在AWK中
,只返回括号中的部分?
答案 0 :(得分:3)
awk '/ERROR|DEBUG|TRACE|WARN|FATAL/ {count[$4,$5]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile
选择包含错误类型的行。一个count
数组元素递增,类型和名称一起作为索引。逗号表示SUBSEP
变量的内容,默认为\034
。在END
块中,迭代count
数组,使用SUBSEP
变量拆分索引。打印类型,名称和计数。
修改强>
这使用正则表达式来处理非结构化日志条目:
awk 'match($0, /(ERROR|DEBUG|TRACE|WARN|FATAL) +[^ ]+/) {s = substr($0, RSTART, RLENGTH); split(s, a); count[a[1],a[2]]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile