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
블록. BEGIN
및 END
의 경우 블록, awk
는 입력 처리가 시작되기 전과 입력 처리가 완료된 후 문을 한 번만 처리합니다. ectively. BEGIN
블록이 없으면 헤더와 같은 일회성 정보를 인쇄 할 수 없을뿐만 아니라 본문에 필요한 일부 변수를 효율적으로 초기화 할 수 없습니다. 또한 참고로 awk
프로그램은 여러 BEGIN
및 END
블록을 가질 수 있습니다.
p>
Answer
awk
는 이전 패턴이 일치 할 때만 모든 블록을 실행합니다. 빈 패턴 (블록 만)은 모든 행과 일치합니다. BEGIN
및 END
는 파일의 시작 및 끝과 일치하는 특수 패턴입니다 (^
및 $
(가로 방향)).
파일을 읽기 전에 실행하려면 BEGIN
. 예를 들어 카운터 초기화 등입니다. 그러면 END
가 결과를 수집 할 수 있습니다.
Answer
주어진 예에서 교육적 명확성을 위해 단순화되었다고 생각합니다. 불필요하다는 것이 맞습니다. BEGIN
를 사용하지 않고도 동일한 결과를 얻을 수 있습니다.
1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }
인쇄 문은 다음과 같으므로 동일한 결과를 생성합니다. 입력의 첫 줄로 제한됩니다.
즉, BEGIN
및 END
블록은 매우 강력합니다. 도구. 다른 솔루션에서 언급했듯이 BEGIN
블록을 사용하여 변수 또는 다른 루틴을 초기화 할 수 있습니다.이 루틴은 한 번만 수행하면되지만없는 경우 Awk 명령을 실행하는데도 사용할 수 있습니다. 처리 할 파일. 간단한 예 :
BEGIN { print sqrt(12/4) }
입력을 처리하지 않고 Awk로 프로그래밍하는보다 진지한 예인 를 볼 수 있습니다. 여기 .
마찬가지로 END
블록은 계산을 수행하고 모든 입력을 요약하는 데 매우 유용합니다. (일반적으로) 모든 데이터를 먼저 읽지 않고서는이 작업을 수행 할 수 없습니다. 입력 요약의 간단한 예는 여기에서 찾을 수 있습니다.