파일에서 마지막 2번의 문자열 다음에 n줄을 복사하는 방법은 무엇입니까?

파일에서 마지막 2번의 문자열 다음에 n줄을 복사하는 방법은 무엇입니까?

파일에서 문자열의 마지막 2개 항목을 찾은 후 처음 n(가령 3개) 줄을 복사할 수 있는 방법이 있습니까? 마지막 발생 이후에만 관심이 있었을 때 다음을 사용했습니다.

grep -A4 'stringhere' filein.txt | tail -n 3 >> fileout.txt

그러나 문자열의 마지막 두 항목에 대한 작업을 수행하기 위해 이 명령을 다시 작성하는 방법을 모르겠습니다.

즉, 다음을 포함하는 입력 파일의 경우:

Text 1  
Text 2  
Text 3  
Text 4  
STRINGIMLOOKINGFOR  
Text 5  
Text 6  
Text 7  
Text 8  
Text 9  
STRINGIMLOOKINGFOR  
Text 10  
Text 11  
Text 12  
Text 13  
Text 14  
STRINGIMLOOKINGFOR  
Text 15  
Text 16  
Text 17  
Text 18  
Text 19  

나는 출력(n=3)이 다음과 같기를 원합니다:

Text 10  
Text 11  
Text 12  
Text 15  
Text 16  
Text 17  

답변1

GNU grep을 사용하십시오:

s="STRINGIMLOOKINGFOR"
grep -Poz "$s"'.*(\n.*){3}' file | grep -v "$s" | tail -n 6
텍스트 10  
텍스트 11  
텍스트 12  
텍스트 15  
텍스트 16  
텍스트 17

답변2

사용 awk:

awk '/^PATT$/{for(i=3;i;--i){getline;print}}' file|tail -n6

위에서는 패턴과 일치하는 전체 행을 찾은 다음 그 뒤의 다음 3개 행을 PATT사용하고 패턴의 마지막 2개 항목 중 마지막 6개 행을 가져오는 작업을 수행합니다 .getlineprinttail -n6

사용grep

grep -A3 --no-group-separator '^PATT$' file |grep -v "PATT" |tail -n6

위와 같이 위와 동일한 내용을 찾고 -A3다음 3줄을 인쇄합니다.일치하는 패턴이 발견되면 PATT해당 행이 결과에서 제외되고 PATT꼬리에도 동일한 작업이 수행됩니다.

이것--no-group-separator에 익숙해grep각 일치 항목 집합 사이에 구분 기호를 인쇄하지 마세요.

답변3

보기 흉하지만 원하는 결과를 얻은 것 같나요?

export n=3
grep -A$n STRINGIMLOOKINGFOR filein.txt | grep -v "^-" | grep -v STRINGIMLOOKINGFOR | tail -`expr $n \* 2`

관련 정보