일치하는 문자열 사이의 행 필터링

일치하는 문자열 사이의 행 필터링

파일에 아래와 유사한 내용이 있습니다. START와 END 사이에 많은 줄이 있으며 오류/경고도 있을 수 있습니다. START & END 사이의 오류/경고 줄을 필터링하고 없으면 건너뛰고 싶습니다. 제목은 이름에 따라 다릅니다. 하지만 START(제목이어야 함)의 다음 줄을 인쇄하는 논리를 만드세요.

START
Heading1
.......
errors
........
END

START
Heading2
........
........
........
END

START
Heading3
.......
errors
Warning...
END

아래 예상 출력

Heading1
errors

Heading3
errors
Warning...

아래에서 시도해 보았지만 START와 END 사이의 모든 내용이 인쇄됩니다. 오류도 필터링해야 해요

awk '/START/,/END/' file

답변1

노력하다:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print hdg; hdg=""}; print} /START/{f=1}' file
Heading1
errors
Heading3
errors

작동 원리

  • f{hdg=$0; f=0}

    가 참(0이 아닌 경우 f)이면 현재 행을 변수에 저장 hdg하고 f다시 0으로 설정합니다.

  • /errors|warning/{if(hdg){print hdg; hdg=""}; print}

    현재 줄에 errors또는 warning이 포함되어 있고 변수가 hdg비어 있지 않으면 인쇄합니다. 또한 현재 줄을 인쇄합니다.

  • /START/{f=1}

    현재 줄에 가 포함되어 있으면 START변수를 f1로 설정합니다.

여러 줄 버전

명령이 여러 줄에 걸쳐 분산되는 것을 선호하는 경우:

awk '
   f {
      hdg=$0
      f=0
   }
   /errors|warning/{
      if(hdg){
         print hdg
         hdg=""
      }
      print
   }
   /START/{
      f=1
   }' file

변형: 제목 앞에 빈 줄을 추가합니다.

출력을 구분하기 위해 빈 줄을 원하는 경우:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1}' file
Heading1
errors

Heading3
errors

변형: END 라인 뒤의 오류/경고 무시

$ awk 'f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file
Heading1
errors

Heading3
errors

위의 대소문자를 구분하지 않으려면(GNU awk):

awk 'BEGIN{IGNORECASE=1} f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file

관련 정보