2017-05-11 1 views
0

특정 키워드가 포함되지 않은 경우 :인쇄 전체 텍스트 블록 만 블록은 내가 그래서 내 파일의 특정 패턴이

.... 
BEGIN 
any text1 
any text2 
END 
.... 
BEGIN 
any text3 
garbage text 
any text4 
END 
.... 
BEGIN 
any text5 
any text6 
END 
... 

BEGINEND 내 표지자를, 그리고 블록에 'garbage text '이 포함되지 않은 경우에만 마커 사이의 모든 텍스트를 추출하고 싶습니다. 그래서 내 기대 블로우 블럭을 추출하는 것입니다 :

any text1 
any text2 

any text5 
any text6 

어떻게 awk에서합니까? 나는 같은 것을 할 수있는 알고

awk '/BEGIN/{f=1;next}/END/{f=0;}f' file.log 

두 마커 사이의 라인을 추출하는,하지만 내가 어떻게 더 'garbage text'의 부재에 따라 추가로 필터링하여 결과를 수정합니까?

답변

1
$ awk '/END/{if (rec !~ /garbage text/) print rec} {rec=rec $0 ORS} /BEGIN/{rec=""}' file 
any text1 
any text2 

any text5 
any text6 

은 위의 모든 END가 BEGIN 이전과 짝을 가정합니다. 멀티 문자의 RS 용 GNU AWK하면 양자 택일 할 수있는 :

$ awk -v RS='END\n' '{sub(/.*BEGIN\n/,"")} RT!="" && !/garbage text/' file 
any text1 
any text2 

any text5 
any text6 

BTW 대신 :

awk '/BEGIN/{f=1;next}/END/{f=0;}f' file.log 

원래 코드가 있어야합니다 단지 :

awk '/END/{f=0} f; /BEGIN/{f=1}' file.log 

는 관련 숙어에 대한 https://stackoverflow.com/a/17914105/1745001 참조 .

관련 문제