다양한 형식의 많은 줄이 포함된 매우 큰 로그 파일을 처리해야 합니다.
내 목표는 동일한 시작 패턴(예: "^2011-02-21.*MyKeyword.*Error")을 사용하여 고유한 행 항목을 추출하여 각 행 패턴에 대한 샘플 목록을 효과적으로 가져와 패턴을 식별하는 것입니다.
나는 지금까지 몇 가지 패턴만 알고 있으므로 파일을 수동으로 탐색하는 것은 확실히 옵션이 아닙니다.
알려진 패턴 외에도 자동으로 추출하고 싶은 알려지지 않은 패턴이 많이 있습니다.
이를 수행하는 가장 좋은 방법은 무엇입니까? 나는 정규식에 대해 많이 알고 있지만 awk/sed에 대해서는 아직 많은 작업을 수행하지 않았으며 언젠가는 이를 사용할 것이라고 생각합니다.
답변1
내가 올바르게 이해했다면 패턴이 여러 개 있고 각 패턴에 대해 일치하는 항목을 추출하려는 것입니다. 다음 awk 스크립트는 이 문제를 해결해야 합니다. 주어진 패턴의 첫 번째 발생을 인쇄하고 이후 발생이 인쇄되지 않도록 표시된 패턴을 기록합니다.
awk '
/^2011-02-21.*MyKeyword.*Error/ {
if (!seen["^2011-02-21.*MyKeyword.*Error"]++) print;
next;
}
1 {if (!seen[""]++) print} # also print the first line that matches no pattern
'
MyKeyword.*Error
이는 하루에 한 행을 유지하는 변형입니다.
awk '
/^[0-9]{4}-[0-9]{2}-[0-9]{2}.*MyKeyword.*Error/ {
if (!seen[substr($0,10) "MyKeyword.*Error"]++) print;
next;
}
'
답변2
라인을 그룹화하려는 경우 명확하지 않습니다.알 수 없는 출력 모드또는알려진 패턴의 알 수 없는 키워드.
첫 번째 경우 다음과 같은 로그가 있는 경우:
[2010-04-02 12:00:00] Error: BaseController Something went wrong
2010-04-02 12:01:00 Warning - Something happened
UserController (2010-04-02 12:02:00) failed with exit status: 1
[2010-04-02 12:03:00] Error: BaseController Something went wrong
[2010-04-02 12:04:00] Error: BaseController Something went wrong
2010-04-02 12:04:01 Warning - Something else happened
UserController (2010-04-02 12:05:00) failed with exit status: 2
UserController (2010-04-02 12:06:00) failed with exit status: 10
tr
그런 다음 및 sort
/또는 uniq
패턴을 탐색하는 데 사용할 수 있습니다 .
$ tr '[:alpha:]' x < file.log | tr '[:digit:]' d | sort -u
dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxxxxxx
dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxx xxxxxxxx
[dddd-dd-dd dd:dd:dd] xxxxx: xxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxx
xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: d
xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: dd
또는 발생 횟수를 계산하려는 경우:
$ tr '[:alpha:]' x < file.log | tr '[:digit:]' d | sort | uniq -c
1
1 dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxxxxxx
1 dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxx xxxxxxxx
3 [dddd-dd-dd dd:dd:dd] xxxxx: xxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxx
2 xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: d
1 xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: dd
그러나 패턴이 항상 동일한 경우, 예를 들어내 키워드항상 같은 위치에 있지만(예 [2010-04-02 12:00:00] Error: BaseController Something went wrong
: ) 해당 위치에 어떤 문자열이 있는지 확인하려면 다음을 수행하면 됩니다.
$ awk '{a[$3]++} END {for (i in a) {printf("%4d %s\n", a[i], i) } }' file.log
이것은 당신에게 다음과 같은 것을 줄 것입니다
3 Error
1 Info
2 Warning