![마지막 패턴 발생을 찾고 마지막 발생 이후의 모든 줄을 인쇄하는 방법](https://linux55.com/image/139885/%EB%A7%88%EC%A7%80%EB%A7%89%20%ED%8C%A8%ED%84%B4%20%EB%B0%9C%EC%83%9D%EC%9D%84%20%EC%B0%BE%EA%B3%A0%20%EB%A7%88%EC%A7%80%EB%A7%89%20%EB%B0%9C%EC%83%9D%20%EC%9D%B4%ED%9B%84%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
여러 패턴이 포함된 파일이 있습니다."====". 이러한 패턴 뒤에는 텍스트가 이어집니다. 마지막으로 발생한 항목을 검색하고 싶습니다."===="패턴을 만들고 패턴 뒤의 모든 줄을 인쇄합니다. 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
과 변형sed
999999
리소스가 매우 적은 시스템의 경우 . 보다 grep
효율적입니다.awk
sed
추측을 피하기 위해 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