주어진 입력:
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"