awk 명령으로 시작 및 종료


13

awk 매뉴얼에 따르면 BEGIN과 END는 입력을 일치시키는 데 사용되지 않고 awk 스크립트에 시작 및 정리 정보를 제공하는 데 사용됩니다. 주어진 예는 다음과 같습니다.

ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

먼저 출력 할 문자열을 인쇄합니다. 그런 다음 입력이 패턴 일치를 확인합니다. 여기서 입력은 a 또는 x로 시작하고 그 뒤에 문자가 한 번 또는 여러 번오고 .conf가옵니다. 일치하는 항목이 있으면 9 번째 열이 인쇄됩니다.

우리가 사용해야한다는 사실은 여기서 시작합니다. 즉, awk는 BEGIN 또는 END가 포함 된 인쇄 기능을 최대 하나만 사용할 수 있습니까? 그렇지 않다면 키워드 BEGIN없이 처음에 인쇄 기능을 사용할 수없는 이유는 무엇입니까? BEGIN이 불필요한 것 같습니다.


BEGIN없이 명령을 실행하면 질문에 대답하여 불필요하지 않으며 다른 결과를 얻을 수 있음을 보여줍니다.
msb

답변:


11

BEGIN불필요하지 않습니다. 당신은 지정하지 않으면 BEGIN다음은 print입력의 모든 라인에 대해 실행됩니다.

매뉴얼 에서 인용 :

BEGIN첫 번째 입력 레코드를 읽기 전에 규칙은 한 번만 실행됩니다. 마찬가지로 END모든 입력을 읽은 후 규칙이 한 번만 실행됩니다.

$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}'   # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}'        # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$

7

awk프로세스 이외의 신체에 주어진 식의 입력 라인 BEGINEND블록. BEGINEND블록 의 경우 awk입력 처리가 시작되기 전과 입력 처리가 각각 완료된 후 명령문을 한 번만 처리합니다. BEGIN블록이 없으면 헤더와 같은 일회성 정보를 인쇄 할 수 없을뿐만 아니라 본문에 필요한 일부 변수를 효율적으로 초기화 할 수 없습니다. 또한, 참고로, awk프로그램은 여러 가질 수 BEGINEND블록.


2

awk패턴이 일치하기 전에 만 모든 블록을 실행합니다. 빈 패턴 (단지 블록)은 모든 줄과 일치합니다. BEGIN그리고 END시작과 파일의 끝 (의 의미와 유사 일치 특별한 패턴입니다 ^$수평 방향으로는).

파일을 읽기 전에 무언가를 실행하려면을 사용하십시오 BEGIN. 예를 들어 카운터 초기화 등. END그런 다음 결과를 수집 할 수 있습니다.


0

교육적 명확성을 위해 단순화 된 것으로 생각되는 예에서, 당신은 그것이 불필요한 것입니다. 를 사용하지 않고도 동일한 결과를 얻을 수 BEGIN있습니다.

1 == NR            { print "Files found:\n" }
/\<[a|x].*\.conf$/ { print $9               }

print 문이 첫 번째 입력 행으로 제한되므로 동일한 결과를 생성합니다.

BEGIN, END블록 과 블록은 매우 강력한 도구입니다. 다른 솔루션에서 언급했듯이 BEGIN블록을 사용하여 한 번만 수행 해야하는 변수 또는 다른 루틴을 초기화 할 수 있지만 처리 할 파일이 없을 때 Awk 명령을 실행하는 데 사용할 수도 있습니다. 간단한 예 :

BEGIN { print sqrt(12/4) }

여기서 입력을 처리하지 않고 Awk에서 프로그래밍의 더 심각한 예제를 볼 수 있습니다 .

마찬가지로 END블록은 계산을 수행하고 모든 입력을 요약하는 데 매우 유용합니다. 모든 데이터를 먼저 읽지 않으면 (보통) 수행 할 수 없습니다. 입력 요약에 대한 간단한 예는 여기에서 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.