Bash에서 n번째 발생 후 여러 줄을 인쇄합니다.

Bash에서 n번째 발생 후 여러 줄을 인쇄합니다.

n번째 패턴 발생을 검색하고 패턴 뒤에 k 줄을 인쇄하는 방법을 찾고 있습니다. 이 상황 awk보다는 나을 것 같은데 grep어떻게 해야 제대로 할 수 있을지 모르겠네요...

다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.

Draft  
blablablabla  
tralalalalala  
Draft  
blablablabla  
tralalalalala  
Draft  
important line 1  
important line 2  
Draft   
blablablabla   
tralalalalala  

이 예에서는 n=3" k=2Draft" 패턴이 세 번째로 나타난 후 2줄을 인쇄하고 싶습니다. 내 특별한 경우에는 n과 k가 다를 수 있습니다.

이것이 쉬운 방법입니까?

답변1

Perl이 구조에 옵니다:

 perl -sne '$c++ if /Draft/;
            if ($c == $n) { print scalar <> for 1 .. $k; }
           ' -- -n=3 -k=2 < input
  • -s스위치를 구문 분석 -n=3하고 변수를 만듭니다.
  • -n입력을 한 줄씩 읽습니다.
  • <>다이아몬드 연산자는 입력에서 읽습니다.
  • 스칼라입력에서 한 줄만 읽어야 합니다. 그렇지 않으면인쇄다이아몬드 연산자에 컨텍스트를 강제로 나열하고 나머지 모든 줄을 인쇄합니다.

답변2

awk: 세 번째와 네 번째 "초안" 줄 사이에 줄을 인쇄합니다.

awk -v n=3 '/Draft/ { p = (++num == n) ; next }; p' file

최적화해야 할 한 가지가 있습니다. 네 번째 초안에 도달하면 종료하는 것입니다.

답변3

grep다음을 사용하여 tail이를 달성 할 수 있습니다 .

$ n=3
$ k=2
$ grep -m "$n" -A "$k" 'Draft' input.txt | tail -n "$k"
important line 1  
important line 2  
$ 

grep 옵션은 -m "$n"첫 번째 일치 후 중지를 지정 n하고 grep에게 각 일치 후에 한 줄을 출력하도록 지시합니다 -A "$k". k그런 다음 파이프를 통해 tail -b "$k"해당 k라인만 출력합니다.

답변4

sed  -ne'/^\(.*\n\)*Draft *$/G'  \
     -e's/\n/&/3;t$' -e'N;D;:$'  \
     -e's///g;//!n;N;G;s/\n//2'  \
     -etq -e/.$/b$ -e:q -e'p;q' <in >out

important line 1
important line 2

관련 정보