다른 문자열이 일치할 때까지 문자열 주위의 모든 줄을 인쇄합니다.

다른 문자열이 일치할 때까지 문자열 주위의 모든 줄을 인쇄합니다.

한 섹션에 "something"으로 시작하는 필드가 있는 샘플 데이터 세트가 있습니다. 특정 문자열 "1234"와 일치할 때 각 "무언가" 섹션의 모든 행을 가져오고 싶습니다.

나는 "1234"를 검색하고 "무언가"가 일치할 때까지 그 앞뒤의 모든 줄을 인쇄할 수 있다고 생각했습니다.

원하는 출력:

something like this one
 1234
 abcd

something like this one
 zyxw
 1234 

예시 데이터세트:

otherthings
otherthings
otherthings

something like this one
 1234
 abcd 

something not like this one
 xxxx
 yyyy 

something not like this one
 xxxx
 yyyy

something like this one
 1234
 abcd

otherthings
otherthings
otherthings

답변1

"awk" 사용:

#!/bin/sh

awk '
    function print_section() {
        # Only print section if "1234" was encountered
        if (valid == 1) print section;
    }
    {
        if (/something/) {
            # Start new section
            section = $0; 
        }
        else if (/^\s*$/) {
            # Empty line -> output previous section
            if (section ne "") {
                print_section();
                section = "";
                valid = 0;
            }
        }
        else if (section ne "") {
            # Add line to section if one has been started
            section = section "\n" $0;
            if (/1234/) valid = 1;
        }
    }
    END {
        # End of file, print current section if it exists
        print_section();
    }
' file

관련 정보