텍스트를 찾은 후 특정 줄 수를 어떻게 읽을 수 있나요?
예:
다음에서 "Unix"를 찾은 후 다음 2줄을 읽어보세요.
Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
결과는 다음과 같습니다.
Test 5
Test 6
참고: 마지막 예의 "Unix"는 인수이므로 다른 텍스트일 수 있습니다.
내가 가진 것:
아직 아이디어가 부족해서 조명만 있으면 됩니다. 그렇게 하기 위해 다른 스크립트를 만드는 것을 생각해보세요.
답변1
해결책 grep
:
grep -A2 -P '^UNIX$' file
설명: -A
의미: 일치 후 다음 두 줄을 인쇄합니다.
또는awk:
awk '$0=="UNIX"{getline; print; getline; print}' file
설명:( ) 줄에서 UNIX를 검색하세요 $0=="UNIX"
. 발견되면 다음 줄을 버퍼( getline
)에 넣고 버퍼( print
)를 인쇄합니다. 이것은 두 번 수행됩니다.
또는 다음을 사용하십시오 sed
.
sed -n '/^UNIX$/{n;p;n;p}' file
설명:UNIX( )를 검색합니다 /^UNIX$/
. 발견되면 에서 해당 부분을 실행합니다 {...}
. n
다음을 의미하고 p
인쇄를 의미합니다. 이것도 두 번 수행됩니다.
답변2
해결책 awk
:
$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
설명
/^UNIX$/{i=1;next}
: 가 보이면UNIX
변수를 설정하고i = 1
다음 입력으로 처리합니다.i
변수가 설정된 경우 (우리가 본 것을 의미UNIX
),i && i++ <= 2
다음 두 줄에서만 참값으로 평가되어 기본 동작이 수행UNIX
됩니다 .awk
print $0
보기 전에는 정의되지 않았으며 이후 세 번째 줄에서 시작하고
UNIX
2 보다 큰 값을 가지 므로 표현식이 false로 평가되어 아무것도 수행되지 않습니다.i
UNIX
i
i && i++ <= 2
awk
답변3
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.
답변4
당신이 사용할 수있는 ex
:
ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin
어디:
1,/UNIX/d
-일치 후 텍스트를 제거합니다.%p
- 버퍼 인쇄q!
- 파일에 변경 사항을 저장하지 않고 종료(wq
내부 편집에 사용)