다른 패턴보다 먼저 패턴을 파악하여 모두 인쇄하세요.

다른 패턴보다 먼저 패턴을 파악하여 모두 인쇄하세요.

주어진 입력:

Via: 1.1.1.1  
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 2.2.2.2
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 3.3.3.3
not relevant lines
Via: 4.4.4.4
not relevant
Via: 5.5.5.5
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
not relevant line N
...

원하는 출력:

Via: 1.1.1.1  
keyword + some text A
keyword + some text A
Via: 2.2.2.2
keyword + some text B
keyword + some text C
Via: 5.5.5.5
keyword + some text D
keyword + some text E

키워드 문자열은 Via 블록에서 N 번 나타날 수도 있고 전혀 나타나지 않을 수도 있습니다. 출력에서는 키워드가 속한 키워드 문자열과 함께 나타나는 Via 블록만 원합니다. 내가 찾은 가장 가까운 대답은여기, 하지만 필요한 것으로 바꿀 수는 없습니다.

답변1

그리고 sed:

sed -n '/^Via:/{ x; /keyword/p; d; }; /keyword/H; ${ x; /keyword/p; }' input.txt

keyword또는 줄의 시작 부분에 고정 하려는 경우 :

sed -n '/^Via:/{ x; /\nkeyword/p; d; }; /^keyword/H; ${ x; /\nkeyword/p; }' input.txt

답변2

해결책:

awk '/^Via:/{ f=1; r=$0; kw=0; next }
     f && /keyword/{ printf "%s%s\n",(!kw)? r ORS:"",$0; kw++ }' file

  • /^Via:/- 변수로 시작하는 Via:줄을 캡처합니다 r. 블록 처리를 f=1나타내는 "활성" 상태로 플래그를 설정합니다.Via

  • kw- 수량을 표시하는 기호"핵심 단어"Via각 블록 아래 줄

  • f && /keyword/- 블록 아래의 라인을 처리할 때 패턴과 일치하는 라인 Via만 고려됩니다.keyword

답변3

간단하고 쉽습니다:

cat input.txt | grep "Via:\|keyword" | grep -B1 "keyword"

관련 정보