파일에 아래와 유사한 내용이 있습니다. 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
변수를f
1로 설정합니다.
여러 줄 버전
명령이 여러 줄에 걸쳐 분산되는 것을 선호하는 경우:
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