일부 텍스트를 찾은 후 특정 수의 줄을 읽는 방법은 무엇입니까?
예를 들어. :
다음에서 "Unix"를 찾은 후 다음 두 줄을 읽으십시오.
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
다음 두 줄에서만 true로 평가되어 기본 작업이 수행UNIX
됩니다 .awk
print $0
보기 전에는
UNIX
정의i
가 없으며 나중에 3행부터 시작하면UNIX
값i
이 2보다 커서 표현식이i && i++ <= 2
false로 평가되어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
내부 편집용)