파일에서 문자열의 마지막 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개 행을 가져오는 작업을 수행합니다 .getline
print
tail -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`