![특정 패턴으로 시작하는 줄을 완전히 무시합니다.](https://linux55.com/image/8036/%ED%8A%B9%EC%A0%95%20%ED%8C%A8%ED%84%B4%EC%9C%BC%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%99%84%EC%A0%84%ED%9E%88%20%EB%AC%B4%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
컴퓨팅 소프트웨어의 출력을 분석하는 스크립트가 있습니다. 때로는 내 스크립트와 관련이 없는 추가 데이터가 출력에 표시되는 경우도 있습니다. 이 데이터는 상당히 커서 간단한 스크립트 실행 속도가 매우 느려질 수 있습니다.
내 스크립트는 awk/bash에 있습니다.
awk에게 특정 패턴 뒤의 행을 완전히 무시하도록 지시할 수 있는지 궁금합니다.
예를 들어:
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
또한 awk에게 특정 패턴으로 시작하는 줄을 찾도록 지시하면 뒤따르는 내용을 무시하고 스크립트 속도를 높일지 궁금합니다.
답변1
특정 줄을 한 줄씩 무시하려면 /unwanted pattern/ {next}
스크립트 시작 부분에 또는 를 추가하세요.! /wanted pattern/ {next}
또는 grep: grep -v 'unwanted pattern' | awk …
또는 을 사용하여 필터링하세요 grep 'wanted pattern' | awk …
. grep이 많은 줄을 제거하면 더 빠를 수 있습니다. 일반적으로 동일한 작업에 대해 grep이 awk보다 빠르기 때문입니다(grep은 더 전문화되어 해당 작업에 최적화되어 있습니다. awk는 완전한 프로그래밍 언어이며 더 많은 작업을 수행할 수 있지만 효율성은 떨어집니다). .
연속된 줄 블록을 무시하려면 awk에 편리한 도구가 있습니다. /^IRRELEVENT DATA/,/^END/ {next}
스크립트 상단에 추가하여 IRRELEVENT DATA
(로 시작하는 모든 줄을 무시합니다.원문) 및 .로 시작하는 첫 번째 줄까지 다음 줄을 입력합니다 END
. grep으로는 이 작업을 수행할 수 없습니다. sed( sed '/^IRRELEVENT DATA/,/^END/d' | awk …
)를 사용하여 수행할 수 있지만 grep에 비해 성능이 향상될 가능성은 없습니다.
답변2
next를 사용하는 대신 부정을 사용하세요.
입력하다:
$ cat f.txt
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
"IRRELEVENT", "IGNORE" 또는 "END" 문자열로 시작하는 줄을 무시하고 싶습니다.
$ awk '!/^(IRRELEVENT|IGNORE|END)/' f.txt
GOOD STUFF
----------------
----------------
----------------
----------------
GOOD STUFF