awk 명령을 사용한 BEGIN 및 END

awk 매뉴얼에 따르면 BEGIN 및 END는 입력을 일치시키는 데 사용되지 않고 시작 및 정리를 제공하는 데 사용됩니다. -up 정보를 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 번째 열이 인쇄됩니다.

여기서 begin을 사용해야한다는 사실은 awk가 BEGIN 또는 END를 포함하는 인쇄 함수를 최대 하나만 사용할 수 있다는 것을 의미합니까? 그렇지 않다면 왜 “BEGIN 키워드없이 처음에 인쇄 기능을 사용할 수 없습니까? BEGIN이 불필요한 것 같습니다.

댓글

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

답변

BEGIN는 불필요한 것이 아닙니다. BEGIN를 지정하지 않으면 모든 입력 행에 대해 print가 실행됩니다.

매뉴얼 :

A 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 $ 

답변

awk는 iv id =”f609fd0811 이외의 본문에 제공된 표현식에 대해 입력 줄을 처리합니다. “>

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

p>

Answer

awk는 이전 패턴이 일치 할 때만 모든 블록을 실행합니다. 빈 패턴 (블록 만)은 모든 행과 일치합니다. BEGINEND는 파일의 시작 및 끝과 일치하는 특수 패턴입니다 (^$ (가로 방향)).

파일을 읽기 전에 실행하려면 BEGIN. 예를 들어 카운터 초기화 등입니다. 그러면 END가 결과를 수집 할 수 있습니다.

Answer

주어진 예에서 교육적 명확성을 위해 단순화되었다고 생각합니다. 불필요하다는 것이 맞습니다. BEGIN를 사용하지 않고도 동일한 결과를 얻을 수 있습니다.

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

인쇄 문은 다음과 같으므로 동일한 결과를 생성합니다. 입력의 첫 줄로 제한됩니다.

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

BEGIN { print sqrt(12/4) } 

입력을 처리하지 않고 Awk로 프로그래밍하는보다 진지한 예인 를 볼 수 있습니다. 여기 .

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다