일부 텍스트를 찾은 후 특정 줄을 읽는 방법은 무엇입니까?

일부 텍스트를 찾은 후 특정 줄을 읽는 방법은 무엇입니까?

일부 텍스트를 찾은 후 특정 수의 줄을 읽는 방법은 무엇입니까?

예를 들어. :

다음에서 "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됩니다 .awkprint $0

  • 보기 전에는 UNIX정의 i가 없으며 나중에 3행부터 시작하면 UNIXi이 2보다 커서 표현식이 i && i++ <= 2false로 평가되어 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내부 편집용)

관련 정보