AWK :

2012-07-18 13 views
1

내 톰캣 로그 형식으로 구축되어 바람둥이 로그 계수 오류 : ERROR_TYPEDEBUG 또는 ERROR 같은 a log4j value입니다AWK :

[<DATE>] [<COMPONENT>] ERROR_TYPE <ERROR_NAME> - <Rest of line> 

. 예를 들어,

,

[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 

어떻게 같은 일치 않습니다 AWK에서

_anything_ (ERROR|DEBUG|TRACE|WARN|FATAL_spaces_ _another_word_)_anything_ 

, 그리고 괄호 부분 만 반환?

답변

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 배열 요소는 색인으로 함께 사용 된 유형과 이름에 대해 증가합니다. 쉼표는 기본값이 \034SUBSEP 변수의 내용을 나타냅니다. 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 
+0

로그가 종종 구조화되지 않은, 그래서 나는'$ 4'와 같은 표현을 사용할 수 없습니다. 전후에 어떤 일이 일어나든지 관계없이 두 단어 만 매칭하고 싶습니다. –

+0

'split' 함수는 값이 아닌 인덱스를 얻기 위해'split (i, a, SUBSEP)'이어야합니다. – Birei

+0

@Birei : 고마워. –