awk/sed/grep: 문자열과 일치하는 모든 줄과 탭 문자가 뒤에 오는 모든 줄을 인쇄합니다.

awk/sed/grep: 문자열과 일치하는 모든 줄과 탭 문자가 뒤에 오는 모든 줄을 인쇄합니다.

특정 UUID로 시작된 http 스레드에 대한 로그 파일에서 데이터를 추출하고 싶습니다. 로그 예:

2018-09-26 06:34:24,815 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:25,224 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 74391) Some log message
2018-09-26 06:34:26,782 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74399) Some log message
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
    at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:26,950 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 74256) Unauthorized: com.xxx.xxx.xxx: Unauthorized
    at com.xxx.xxx.xxx(someclass.java:39) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:49) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:45) [somejar.jar:1.0.0]
2018-09-26 06:34:26,952 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74395) Some log message
2018-09-26 06:34:27,014 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
2018-09-26 06:34:27,530 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74365) Some log message

이미 grep 및 BASH_REMATCH를 사용하여 UUID를 검색하고 스레드 번호를 추출할 수 있습니다. 스레드 번호를 알면 "http-threads-threads-73244"를 검색할 수 있습니다. 이제 해당 문자열이 포함된 모든 줄과 해당 줄(탭이 있는 줄) 뒤의 최종 예외를 인쇄하고 싶습니다.

나는 다음과 같은 출력을 원합니다 :

2018-09-26 06:34:24,815 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
    at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:27,014 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread

grep -A 3일치 후 탭 줄 수가 가변적이어서 사용할 수 없습니다 .

를 사용하여 awk '/http\-threads\-threads \- 73244/{print $0; getline}/\tat/{print $0}' log.log추가 탭 줄을 인쇄할 수도 있습니다 .

를 사용하면 awk '/http\-threads\-threads \- 73244/{a=1;print}/(2[0-9][0-9][0-9]\-[0-1]\-[0-9])/{a=0}' log.log탭 줄이 전혀 인쇄되지 않습니다.

완벽한 해결책은 이전에 추가 "grep" 및 "BASH_REMATCH"를 제거하고 UUID를 사용하는 것이지만 스레드 번호를 "입력"으로 사용하는 솔루션으로는 완전히 괜찮습니다.

누구든지 해결책이 있습니까?

답변1

다음 AWK 스크립트는 UUID를 일치시키고 관심 있는 해당 행을 출력합니다.

#!/usr/bin/awk -f

/UUID: 111-222-333-444-555/ {
    tid = substr($7, 1, length($7) - 1)
}

/^[^\t].*http-threads-threads/ {
    if (substr($7, 1, length($7) -1) == tid) {
        matched = 1
        print
    } else {
        matched = 0
    }
}

/^\t/ && matched

첫 번째 블록은 UUID와 일치하고 해당 스레드 식별자를 저장합니다.

두 번째 블록은 탭으로 시작하지 않고 "http-threads-threads"를 포함하는 행과 일치합니다. 일곱 번째 필드가 스레드 식별자와 일치하면 스크립트는 일치하는 블록에 있음을 나타내고 현재 줄을 인쇄합니다. 그렇지 않으면 스크립트는 일치하는 블록에 없음을 나타냅니다.

일치 블록 안에 있을 때 세 번째 블록은 탭 문자로 시작하는 줄을 일치시켜 인쇄합니다(현재 줄을 인쇄하는 것이 기본 동작입니다).

관련 정보