여러 패턴을 일치시킨 후 awk 또는 sed를 사용하여 파일에서 결과를 분리합니다.

여러 패턴을 일치시킨 후 awk 또는 sed를 사용하여 파일에서 결과를 분리합니다.

많은 INFO 메시지와 시스템 출력 라인이 포함된 애플리케이션 로그 중 하나에서 2가지 패턴에 포함된 라인을 추출한 다음 결과 라인의 다른 라인에서 구체적으로 값을 가져올 수 있기를 원합니다.

이것은 내 입력 파일입니다.

2019-08-16 00:38:29,171 1065142892 [http-bio-8443-exec-146] INFO aaaaa
2019-08-16 00:38:29,172 1065142893 [http-bio-8443-exec-146] INFO bbbbb
              'This is the matching pattern'
tag1: value1
tag2: value2
tag3: value3
'this is the end pattern' xxxyyyzzz

2019-08-16 00:39:29,171 1065142992 [http-bio-8443-exec-146] INFO aaaaa
2019-08-16 00:39:29,172 1065142993 [http-bio-8443-exec-146] INFO bbbbb
              'This is the matching pattern'
tag1: valuea
tag2: valueb
tag3: valuec
'this is the end pattern' xxxyyyzzzadasd

2019-08-16 00:38:29,171 1065142892 [http-bio-8443-exec-146] INFO aaaaa
2019-08-16 00:38:29,172 1065142893 [http-bio-8443-exec-146] INFO bbbbb
              'This is the matching pattern'
tag1: valuep

2019-08-16 01:38:29,171 1065153992 [http-bio-8443-exec-146] INFO aaaaa
2019-08-16 01:38:29,172 1065153993 [http-bio-8443-exec-146] INFO bbbbb
              'This is the matching pattern1'
tag1: valuexx
tag2: valueyy
tag3: valuezz
'this is the end pattern' xxxyyyzzzadasdqwerty

여기에서 다음을 통해 출력을 추출하고 싶습니다.

산출:

value1, value2
valuea, valueb
valuexx, valueyy

결과를 필터링하기 위해 다음을 사용해 보았습니다.

awk '/This is the matching pattern/,/This is the end pattern/' logfile
OR
awk ' /This is the matching pattern/{flag=1;next}/This is the end pattern/{flag=0}flag' logfile
OR
sed -n -e '/This is the matching pattern/,/this is the end pattern/{ /This is the matching pattern/d; /this is the end pattern/d; p; }'  logfile

하지만 이것들은라벨 1: 값 p출력에 일치하는 끝 패턴 시작이 없습니다.

답변1

귀하의 예에서는 테스트할 이유가 없으며 This is the matching pattern끝에 정규식만 있습니다.

$ cat tst.awk
BEGIN { FS=": "; OFS=", " }
{ f[$1] = $2 }
/this is the end pattern/ {
    print f["tag1"], f["tag2"]
    delete f
}

$ awk -f tst.awk file
value1, value2
valuea, valueb
valuexx, valueyy

관련 정보