답변:
awk솔루션 :
$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
설명
/^UNIX$/{i=1;next}: 참조하면 UNIXvariable i = 1을 처리하여 다음 입력으로 설정합니다 .
변수 i가 설정되면 (우리가 본 의미 UNIX), i && i++ <= 2다음 두 줄에서만 true 값으로 평가되어 기본 작업 UNIX이 awk수행 print $0됩니다.
보기 전에 UNIX, i정의되지 않은 이후 세번째 줄에서 시작 UNIX, i표현하기 2보다 값이 더 큰했다 i && i++ <= 2일으키지 않는, false로 평가 awkDO 아무것도.
$내 대답의 시작 부분에 있는 부호는 awk명령의 일부가 아닌 쉘 프롬프트 입니다.
awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
grep솔루션 :
grep -A2 -P '^UNIX$' file
설명 : -A 의미 : 일치 후 다음 두 줄 인쇄
또는 awk:
awk '$0=="UNIX"{getline; print; getline; print}' file
설명 : 해당 명령문은 라인 ( $0=="UNIX") 에서 UNIX를 검색합니다 . 그것이 주어지면 다음 버퍼 ( getline) 로 다음을 가져와 버퍼 ( )를 인쇄합니다 print. 이것은 두 번 수행됩니다.
또는 사용 sed:
sed -n '/^UNIX$/{n;p;n;p}' file
설명 : UNIX ( /^UNIX$/)를 검색합니다. 이것이 발견되면의 부분을 txecute합니다 {...}. n다음을 p의미하고 인쇄를 의미합니다. 이것은 두 번 수행됩니다.
getline; print;이 awk명령문의 n;p;파트 또는 명령문 의 파트를 반복하는 경우 숫자를 변경합니다 sed.
grep -A100 -P '^UNIX$' file | tail -n +2. 꼬리 부분은 첫 번째 유치권을 제거하는 것입니다. 다른 (sed, awk)에서는 루프를 작성해야하므로 덜 간단합니다.
grep -A 2 UNIX file.txt
grep 맨 페이지는 옵션을 다음과 같이 설명합니다.
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing -- between contiguous groups of
matches.
UNIX출력으로도 인쇄 됩니다.
UNIX, 파이프를에 tail: [...] | tail -n +1나에 sed: [...] | sed '1d'.
tail및 sed '1d'제안이 올바르게 작동합니다 UNIX. 다른 모든 답변은 여러 번 발생할 수 있습니다. 제안하는 것이 좋습니다 ... | grep -v UNIX. 경우에 인정 하듯이,이 혼란을 가져 UNIX선 15에 표시가 17
sed어떤 형태 로 수행 될 수 있다고 확신합니다 sed '/UNIX/d;n;n;p/' /path/to/file.
이것은 트릭을 훌륭하게 수행하는 것 같습니다.
sed -n '/UNIX/{n;p;n;p}' /path/to/file
개념의 증거:
$ for i in {1..9}; do echo $i; done | sed -n '/4/{n;p;n;p}'
5
6
for루프 주변의 서브 쉘 은 필요하지 않습니다.
당신은 사용할 수 있습니다 ex:
ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin
어디:
1,/UNIX/d- 일치 후 텍스트를 제거합니다%p -인쇄 버퍼q!-파일 변경 사항을 저장하지 않고 종료 (내부 wq편집에 사용 )