마지막 패턴 발생을 찾고 마지막 발생 이후의 모든 줄을 인쇄하는 방법

마지막 패턴 발생을 찾고 마지막 발생 이후의 모든 줄을 인쇄하는 방법

여러 패턴이 포함된 파일이 있습니다."====". 이러한 패턴 뒤에는 텍스트가 이어집니다. 마지막으로 발생한 항목을 검색하고 싶습니다."===="패턴을 만들고 패턴 뒤의 모든 줄을 인쇄합니다. Bash에서 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? grep, awk, sed등 의 조합 tail?

샘플 파일:

====

First run of script

End of first Script

====

2nd run of script

End of 2nd script

====

3rd run of script

End of 3rd script

이 명령의 출력은 다음과 같아야 합니다.

3rd run of script

End of 3rd script

답변1

agc의 답변과 동일한 개념이지만 행 수를 추측할 필요는 없습니다.

GNU sed 사용

tac file | sed '/====/Q' | tac

아니면 어이

tac file | awk '/====/ {exit} 1' | tac

double의 아이디어 tac는 문제를 뒤집는 것입니다: 모든 줄을 인쇄하는 방법앞으로이것첫 번째패턴이 발생합니다. 이것은 훨씬 간단한 질문입니다.

답변2

소프트웨어 도구 접근 방식은 파일 끝만 읽고 마지막 일치 항목이 발견되면 중지하므로 대용량 파일에 더 효율적입니다.

tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac

참고: 999999가능한 일치 항목보다 길게 만들기 위해 필요에 따라 늘리거나 줄입니다. 이 코드는 마지막 일치 항목이 대용량 파일의 끝 부분에 가까울 것이라는 점을 미리 알고 있는 경우 가장 잘 작동합니다. 당신은 또한 볼 수 있습니다글렌 잭맨및의 답변 awk과 변형sed999999리소스가 매우 적은 시스템의 경우 . 보다 grep효율적입니다.awksed

추측을 피하기 위해 stat뭔가 추악한 것을 추가하는 것이 효과적입니다.

f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac

답변3

기반으로그러니 반복해:

$ sed -n '/====/h;//!H;$!d;x;//p' sample.txt 
====

3rd run of script

End of 3rd script

Output of the command should look like below.

3rd run of script

End of 3rd script

설명을 쓰기 시작했지만 실제로 일부 명령을 이해하지 못해 참조만 했습니다 info sed.

답변4

텍스트를 저장 file.txt하고 다음 명령을 실행합니다.

awk 'p; /====/ $p' file.txt | tail -3

산출:

3rd run of script

End of 3rd script

관련 정보