특정 패턴으로 시작하는 줄을 완전히 무시합니다.

특정 패턴으로 시작하는 줄을 완전히 무시합니다.

컴퓨팅 소프트웨어의 출력을 분석하는 스크립트가 있습니다. 때로는 내 스크립트와 관련이 없는 추가 데이터가 출력에 표시되는 경우도 있습니다. 이 데이터는 상당히 커서 간단한 스크립트 실행 속도가 매우 느려질 수 있습니다.

내 스크립트는 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

관련 정보