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


12

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

예 :

"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"는 인수이므로 다른 텍스트 일 ​​수 있습니다.

내가 가진 것 :

나는 아직도 아이디어가 없다. 단지 빛이 필요하다. 이를 위해 다른 스크립트를 작성하십시오.

답변:


10

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 값으로 평가되어 기본 작업 UNIXawk수행 print $0됩니다.

  • 보기 전에 UNIX, i정의되지 않은 이후 세번째 줄에서 시작 UNIX, i표현하기 2보다 값이 더 큰했다 i && i++ <= 2일으키지 않는, false로 평가 awkDO 아무것도.


테스트 후에는 솔루션 메신저이 오류 메시지가 표시 : 오류 systax를 선 1 근처 1 호선 근처에 구제
콜드

@Cold : 무엇을 실행 했습니까? $내 대답의 시작 부분에 있는 부호는 awk명령의 일부가 아닌 쉘 프롬프트 입니다.
cuonglm

다른 변형 :awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
musiphil

나는 @cuonglm
Cold

@Cold : OS가 무엇입니까?
cuonglm

12

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의미하고 인쇄를 의미합니다. 이것은 두 번 수행됩니다.


@ 카오스 감사합니다, 당신이주는 마지막 2 옵션을 시도합니다. 각 옵션에 대한 설명을 추가하고 이해하고 수행하십시오.
Cold

줄 수가 변경되면 마지막 두 옵션에서 얼마나 많은 변경을 수행합니까? 감사합니다
Cold

@Cold 내 편집을 참조하십시오. 행 getline; print;awk명령문의 n;p;파트 또는 명령문 의 파트를 반복하는 경우 숫자를 변경합니다 sed.
혼돈

@ 카오스 덕분에 감사하지만 줄 수가 많을수록 표현력이 향상되고 내 의견으로는 변경이 불가능합니다. 당신은 생각하지 않습니까? 100 줄이면?
Cold

@Cold 그런 다음 grep 솔루션을와 함께 사용합니다 grep -A100 -P '^UNIX$' file | tail -n +2. 꼬리 부분은 첫 번째 유치권을 제거하는 것입니다. 다른 (sed, awk)에서는 루프를 작성해야하므로 덜 간단합니다.
혼돈

4
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.

안녕하세요 @Twinkles, 좋은 대답이지만 내 grep에는 "hblcnsviw"옵션 만 있습니다. 그러나 논리는 좋습니다. 감사합니다
Cold

UNIX출력으로도 인쇄 됩니다.
cuonglm

를 생략하려면 UNIX, 파이프를에 tail: [...] | tail -n +1나에 sed: [...] | sed '1d'.
DopeGhoti

1
@DopeGhoti : 입력 텍스트에 한 번만 나타나는 경우 제안 tailsed '1d'제안이 올바르게 작동합니다 UNIX. 다른 모든 답변은 여러 번 발생할 수 있습니다. 제안하는 것이 좋습니다 ... | grep -v UNIX. 경우에 인정 하듯이,이 혼란을 가져 UNIX선 15에 표시가 17
G-남자 '분석 재개 모니카'말한다

좋은 지적입니다. 나는 그것이 sed어떤 형태 로 수행 될 수 있다고 확신합니다 sed '/UNIX/d;n;n;p/' /path/to/file.
DopeGhoti

0

이것은 트릭을 훌륭하게 수행하는 것 같습니다.

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

1
for루프 주변의 서브 쉘 은 필요하지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

실제로 그렇지 않습니다. 그것은 그 날 초에 그 껍질 위에 있던 다른 다른 것들의 잔재였습니다. Parens가 제거되었습니다.
DopeGhoti

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.