관심있는 것들 정리

Effect AWK programming 내맘대로 번역 본문

programming/awk

Effect AWK programming 내맘대로 번역

내공강화 2021. 2. 13. 13:12

아놀드 로빈스의 effective awk programming을 내 맘대로, 원하는 부분을 시간날때마다 조금씩 번역해볼 예정입니다. 구글 번역기도 동원하고, 그냥 번역도 하기도 할 거라서.. 번역이 엉망일 것이라, 오역에 대해서는 책임지지 않습니다 :-)


Foreword to the Third Edition
*****************************
Arnold Robbins와 저는 좋은 친구입니다. 우리는 1990 년에 상황과 우리가 가장 좋아하는 프로그래밍 언어인 AWK를 통해 알게 되었습니다. 상황은 몇 년 전에 시작되었습니다. 나는 새로운 직장에서 일하고 있었는데 플러그가 뽑힌 Unix 컴퓨터가 구석에 놓여 있는 것을 발견했습니다. 아무도 그것을 사용하는 방법을 알지 못했고 나도 마찬가지였습니다. 그러나 며칠 후 그 머신은 동작하고 있었고, 나는 root이자 유일한 사용자였습니다. 그날 저는 통계 학자에서 유닉스 프로그래머로 바뀌기 시작했습니다. Unix에 관한 책을 찾기 위해 도서관이나 서점을 여러 번 방문했을 때 회색 AWK 책인 Alfred V. Aho, Brian W. Kernighan 및 Peter J. Weinberger의 The AWK Programming Language (Addison-Wesley, 1988)를 발견했습니다). awk의 간단한 프로그래밍 패러다임 (입력에서 패턴을 찾은 다음 작업 수행)은 복잡하거나 지루한 데이터 조작을 몇 줄의 코드로 줄였습니다. 나는 AWK에서 프로그래밍을 시도하게 되어 신이 났습니다. 아아, 내 컴퓨터의 awk는 회색 책에 설명 된 언어의 제한된 버전이었습니다. 내 컴퓨터에 "old awk"가 있고 책에 "new awk"가 설명되어 있음을 발견했습니다. 나는 이것이 전형적인 것이라는 것을 배웠습니다. 이전 버전은 현재의 자리에서 물러나거나 포기하는 것을 거부했습니다. 시스템에 새 awk가있는 경우 항상 nawk라고 불렸고 이를 가진 시스템은 거의 없었습니다. 새로운 awk를 얻는 가장 좋은 방법은 prep.ai.mit.edu에서 gawk의 소스 코드를 ftp하는 것이었습니다. gawk는 David Trueman과 Arnold가 작성한 새로운 awk 버전으로 GNU General Public License에 따라 사용할 수 있었습니다. (사실상 더 이상 새로운 awk를 찾는 것이 어렵지 않습니다. gawk는 GNU / Linux와 함께 제공되며 거의 모든 시스템의 바이너리 나 소스 코드를 다운로드 할 수 있습니다. 제 아내는 VMS 상자에서 gawk를 사용합니다.) 내 Unix 시스템은 벽에서 분리 된 상태로 시작되었습니다. 그리고 네트워크에 연결되어 있지 않았습니다. 그래서 gawk와 Unix 커뮤니티의 존재를 잊은 채, 새로운 awk를 원하면서 mawk라고하는 내 자신의 문서를 작성했습니다. 작업을 마치기 전에, gawk에 대해 알고 있었지만 작업을 중단하기에는 너무 늦어서, 결국 comp.sources 뉴스 그룹에 게시했습니다. 게시물을 올린 후 며칠 후 Arnold에서 자신을 소개하는 친절한 이메일을 받았습니다. 그는 디자인과 알고리즘을 공유하자고 제안하면서 POSIX 표준의 초안을 첨부하여 보내주었고, 그로 인해 나는 AWK Programming Langauge가 출판된 후 추가된 언어 확장을 지원하도록 mawk를 업데이트 할 수 있었습니다. 솔직히 말해서, 우리의 역할이 바뀌었다면 나는 그렇게 개방적이지 않았을 것이고 아마 만나지 못했을 것입니다. 나는 그 당시 우리가 만났다는 것을 기뻐하고 있습니다. 그는 AWK 전문가의 AWK 전문가이자 진정으로 좋은 사람입니다. Arnold는 Free Software Foundation에 그의 전문성과 시간의 상당 부분을 기여하고 있습니다. 이 책은 gawk 참조 매뉴얼이지만 그 핵심은 AWK 프로그래밍에 관한 책으로 폭 넓은 청중에게 어필 할 것입니다. 1987 년 Bell Laboratories 릴리스에 정의되고 1992 POSIX 유틸리티 표준에 성문화 된 AWK 언어에 대한 결정적인 참고자료입니다. 달리 표현하면, 초보 AWK 프로그래머는 AWK의 기본 관용구 (데이터 기반 제어 흐름, 정규 표현식과 패턴 일치 및 연관 배열)의 힘을 강조하는 다양한 실용적인 프로그램을 공부할 수 있습니다. 새로운 것을 찾는 사람들은 특별한 / inet 파일을 통해 네트워크 프로토콜에 대한 gawk의 인터페이스를 사용해 볼 수 있습니다. 이 책에 실린 프로그램은 AWK 프로그램이 일반적으로 C로 작성된 대응 프로그램보다 훨씬 작고 개발 속도가 빠르다는 것을 명확히 알게 해 줍니다. 따라서 AWK에서 알고리즘이나 디자인을 프로토타이핑하여 신속하게 실행하고 문제를 조기에 노출하는 것이 보상이 되기도 합니다. . 종종 해석된 성능이 적절하고 AWK 프로토 타입이 제품이 되기도 합니다. 새로운 pgawk (프로파일 링 gawk)는 프로그램 실행 횟수를 생성합니다. 나는 최근에 n 라인의 입력에 대해 ~ C n ^ 2 성능을 나타내는 알고리즘을 실험했으며 이론은 ~ C n log n 동작을 예측했습니다. awkprof.out 프로필을 살펴보면 몇 분만에 한 줄의 코드로 문제를 파악했습니다. pgawk를 내 프로그래머 toolbox에 추가하는 것은 환영할만한 일이다. Arnold는 AWK 프로그램을 작성 및 사용하고 gawk를 개발한 10 년 이상의 경험을 이 책에 담았습니다. AWK를 사용하거나 방법을 배우고 싶다면이 책을 읽으십시오.

       Michael Brennan
       Author of 'mawk'
       March 2001

Foreword to the Fourth Edition
******************************
어떤 것은 변하지 않습니다. 13 년 전에 저는 "AWK를 사용하거나 방법을 배우고 싶다면 이 책을 읽으십시오."라고 썼습니다. 그 때는 사실이며 오늘날에도 마찬가지입니다. 프로그래밍 언어를 사용하는 방법을 배우는 것은 구문을 마스터하는 것 이상입니다. 실용적인 프로그래밍 문제를 해결하기 위해 언어의 기능을 사용하는 방법을 이해해야 합니다. 이 책의 초점은 AWK 사용 방법을 보여주는 많은 예입니다. 어떤 것들은 변합니다. 우리 컴퓨터는 훨씬 더 빠르고 더 많은 메모리를 가지고 있습니다. 결과적으로 고급 언어의 속도와 스토리지 비 효율성은 그다지 중요하지 않습니다. AWK에서 프로토타이핑 한 다음 성능상의 이유로 C로 다시 작성하는 일은 더 적게 발생합니다. 프로토 타입이 충분히 빠르기 때문입니다. 물론 C 또는 C ++에서 가장 잘 수행되는 컴퓨팅 작업이 있습니다. gawk 4.1 이상에서는 AWK 또는 C / C ++로 프로그램을 작성하는 것 중에서 선택할 필요가 없습니다. 대부분의 프로그램을 AWK로 작성할 수 있으며 C / C ++ 기능을 필요로하는 측면은 C / C ++로 작성할 수 있으며 gawk 모듈이 C / C ++ 모듈을 동적 플러그인으로로드 할 때 부분을 서로 붙입니다. gawk 용 확장 프로그램 작성에는 모든 세부 사항이 포함되어 있으며 예상대로 기능을 익히는 데 도움이되는 많은 예제가 있습니다. 나는 AWK에서 프로그래밍을 즐기고이 책을 재미있게 읽었습니다. 나는 당신도 그럴 것이라고 생각합니다.

      Michael Brennan
      Author of 'mawk' October 2014

Preface
*******
텍스트 파일로 작업 할 때 여러 종류의 작업이 반복적으로 발생합니다. 특정 라인을 추출하고 나머지는 버릴 수 있습니다. 또는 특정 패턴이 나타날 때마다 변경해야 할 수도 있지만 나머지 파일은 그대로 둡니다. 그러한 일은 awk로 하면 쉬운 것들이 많습니다. awk 유틸리티는 간단한 데이터 재 포맷 작업을 쉽게 처리 할 수 있는 특수 목적의 프로그래밍 언어와 같이 해석합니다. awk의 GNU 구현을 gawk라고합니다. 적절한 옵션이나 환경 변수를 사용하여 호출하면 awk 언어의 POSIX 사양 및 Brian Kernighan이 유지 관리하는 awk의 Unix 버전과 완전히 호환됩니다. 이는 올바르게 작성된 모든 awk 프로그램이 gawk와 함께 작동해야 함을 의미합니다. 따라서 대부분의 경우 gawk와 다른 awk 구현을 구분하지 않습니다. awk를 사용하면 다음을 수행 할 수 있습니다:

  * 소규모 개인 데이터베이스 관리
  * 보고서 생성 * 데이터 유효성 검사
  * 색인 생성 및 기타 문서 준비 작업 수행
  * 나중에 다른 컴퓨터 언어에 적용할 수 있는 알고리즘 실험

또한 gawk는 다음을 쉽게 수행할 수 있는 기능을 제공합니다:

  * 처리를 위해 데이터 비트 및 부분 추출
  * 데이터 정렬 * 간단한 네트워크 통신 수행
  * awk 프로그램 프로파일링 및 디버그
  * C 또는 C ++로 작성된 함수로 언어 확장

이 웹 페이지는 awk 언어와 이를 효과적으로 사용하는 방법을 알려줍니다. 독자는 입력/출력 (I/O) 리디렉션 및 파이프와 같은 기본 셸 기능뿐만 아니라 cat 및 ls와 같은 기본 시스템 명령에 이미 익숙해야 합니다. awk 언어의 구현은 다양한 컴퓨팅 환경에서 사용할 수 있습니다. 이 웹 페이지는 일반적으로 awk 언어를 설명하면서 gawk (“GNU awk”를 의미 함)라는 awk의 특정 구현을 설명합니다. gawk는 Intel 아키텍처 PC 기반 컴퓨터부터 대규모 시스템에 이르기까지 광범위한 Unix 시스템에까지 실행됩니다. gawk는 또한 Mac OS X, Microsoft Windows (모든 버전) 및 OpenVMS로 이식되었습니다.

History of 'awk' and 'gawk'
===========================

Recipe for a Programming Language
1 part 'egrep' 1 part 'snobol'
2 parts 'ed' 3 parts C

Blend all parts well using 'lex' and 'yacc'. Document minimally and release.
After eight years, add another part 'egrep' and two more parts C. Document very well and release.

  awk라는 이름은 설계자들인 Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan의 이니셜에서 따 왔습니다. awk의 원래 버전은 1977 년 AT & T Bell Laboratories에서 작성되었습니다. 1985 년에 새 버전은 프로그래밍 언어를 더욱 강력하게 만들어 사용자 정의 함수, 다중 입력 스트림 및 계산된 정규식을 도입했습니다. 이 새 버전은 Unix System V 릴리스 3.1 (1987)에서 널리 사용 가능하게되었습니다. System V 릴리스 4 (1989)의 버전은 몇 가지 새로운 기능을 추가하고 언어의 일부 "어두운 구석"에서 동작을 정리했습니다. POSIX 명령 언어 및 유틸리티 표준의 awk 사양은 언어를 더욱 명확하게 했습니다. gawk 설계자들과 Bell Laboratories의 원래 awk 설계자들 모두 POSIX 사양에 대한 피드백을 제공했습니다. Paul Rubin은 1986 년 gawk를 썼습니다. Jay Fenlason은 Richard Stallman의 조언을 받아 완성했습니다. John Woods도 코드의 일부를 제공했습니다. 1988 년과 1989 년에 David Trueman은 저의 도움을 받아 새로운 awk와의 호환성을 위해 gawk를 완전히 재작업했습니다. 1994 년경, 나는 주요 관리자가 되었습니다. 현재 개발은 버그 수정, 성능 향상, 표준 준수 및 때때로 새로운 기능에 중점을 둡니다. 1997 년 5 월 Jürgen Kahrs는 awk에서 네트워크 액세스가 필요하다고 느꼈고 약간의 도움을 받아 gawk를위한 기능을 추가했습니다. 그 당시 그는 gawk (gawk 배포에서 구할 수 있는 별도의 문서)를 사용하여 TCP / IP 인터 네트워킹의 대부분을 작성했습니다. 그의 코드는 마침내 gawk 버전 3.1과 함께 기본 gawk 배포판의 일부가되었습니다. John Haque는 awk 수준의 디버거를 제공하는 과정에서 gawk 내부를 다시 작성했습니다. 이 버전은 2011 년에 gawk 버전 4.0으로 제공되었습니다.

A Rose by Any Other Name
========================
awk 언어는 수년에 걸쳐 진화했습니다. 자세한 내용은 awk 언어의 진화에서 제공됩니다. 이 웹 페이지에 설명 된 언어를 종종 "new awk"라고합니다. 비유하자면 awk의 원래 버전은 "old awk"라고합니다. 대부분의 현재 시스템에서 awk 유틸리티를 실행하면 새로운 awk 버전의 결과를 얻게 됩니다. 시스템의 표준 awk가 이전 버전 인 경우 다음 테스트 프로그램을 시도하면 다음과 같은 내용이 표시됩니다:

$ awk 1 /dev/null
error-> awk: syntax error near line 1
error-> awk: bailing out near line 1

  이 경우 새 awk 버전을 찾거나 gawk를 설치해야 합니다! 이 웹 페이지에서 POSIX awk의 완전한 구현에서 사용할 수있는 언어 기능을 언급 할 때마다 awk라는 용어를 사용합니다. GNU 구현에 특정한 기능을 언급 할 때 gawk라는 용어를 사용합니다.

Using This Book
===============
용어 awk는 특정 프로그램과 이 프로그램에 수행 할 작업을 지정하는 데 사용하는 언어를 나타냅니다. 주의해야 할 때, 언어를 "awk 언어"라고 부르고 프로그램을 "awk 유틸리티"라고 부릅니다. 이 웹 페이지는 awk 언어로 프로그램을 작성하는 방법과 awk 유틸리티를 실행하는 방법을 모두 설명합니다. "awk 프로그램"이라는 용어는 awk 프로그래밍 언어로 작성한 프로그램을 나타냅니다. 주로 이 웹 페이지는 POSIX 표준에 정의된 awk의 기능을 설명합니다. 그것은 gawk 구현의 맥락에서 그렇게 합니다. 그렇게하면서 gawk와 다른 awk 구현 간의 중요한 차이점을 설명하려고 시도합니다. 마지막으로 awk에 대한 POSIX 표준에 없는 모든 gawk 기능을 언급합니다. 이 웹 페이지는 튜토리얼이자 참조가 되는 어려운 작업을 가지고 있습니다. 초보자라면 너무 복잡해 보이는 세부 사항은 건너 뛰어도됩니다. 또한 많은 상호 참조를 무시해야 합니다. 이것들은 전문가 사용자와 웹 페이지의 정보 및 HTML 버전을 위한 것입니다. 웹 페이지 전체에 흩어져있는 사이드 바가 있습니다. 이는 관련성이 있지만 처음 읽을 때는 관심이 없을 것 같은 요점에 대한 보다 완전한 설명을 추가합니다. 모두 색인의 "사이드 바"제목 아래에 나타납니다. 대부분의 경우 예제는 완전한 awk 프로그램을 사용합니다. 일부 고급 섹션에서는 설명중인 개념을 설명하는 awk 프로그램의 일부만 보여줍니다.
이 웹 페이지는 주로 awk에 노출되지 않은 사람들을 대상으로하지만 여기에는 awk 전문가조차도 유용하다고 생각할 정보가 많이 있습니다. 특히, POSIX awk에 대한 설명과 awk 함수 라이브러리 및 실용적인 awk 프로그램의 예제 프로그램이 흥미로울 것입니다. 이 웹 페이지는 다음과 같이 여러 부분으로 나뉩니다.

파트 I에서는 awk 언어와 gawk 프로그램에 대해 자세히 설명합니다. 기본부터 시작하여 awk의 모든 기능을 계속합니다. 다음 장으로 구성됩니다:
  - Getting Started with awk는 awk 사용을 시작하기 위해 알아야 할 필수 사항을 제공합니다.
  - Running awk and gawk는 gawk 실행 방법, 명령 줄 옵션의 의미 및 awk 프로그램 소스 파일을 찾는 방법에 대해 설명합니다.
  - Regular Expressions는 일반적인 정규식, 특히 POSIX awk 및 gawk에서 지원하는 특징을 소개합니다.
  - Reading Input Files는 awk가 데이터를 읽는 방법을 설명합니다. 레코드 및 필드의 개념과 getline 명령을 소개합니다. I/O 리디렉션은 여기에서 먼저 설명합니다. 네트워크 I/O도 여기에서 간략하게 소개합니다.
  - Printing Output는 awk 프로그램이 print 및 printf를 사용하여 출력을 생성하는 방법을 설명합니다.
  - Expressions은 프로그램에서 대부분의 작업을 수행하기위한 기본 구성 요소인 표현식을 설명합니다.
  - Patterns, Actions, and Variables는 레코드 검출을 위한 패턴 작성 방법, 레코드가 일치할 때 작업을 수행하기 위한 조치, awk 및 gawk가 사용하는 사전 정의된 변수를 설명합니다.
  - Arrays in awk은 awk의 유일한 데이터 구조인 연관 배열을 다룹니다. 배열 요소 및 전체 배열 삭제와 gawk 배열 정렬에 대해 설명합니다. 이 장에서는 gawk가 배열의 배열을 제공하는 방법도 설명합니다.
  - Functions는 awk 및 gawk가 제공하는 내장 함수와 사용자 고유의 함수를 정의하는 방법을 설명합니다. 또한 gawk를 사용하여 함수를 간접적으로 호출하는 방법에 대해서도 설명합니다.

파트 II는 문제 해결을 위해 awk 및 gawk를 사용하는 방법을 보여줍니다. 여기에는 읽고 배울 수있는 많은 코드가 있습니다. 이 부분은 다음 장으로 구성됩니다:
  - A Library of awk Functions는 주요 awk 프로그램에서 사용되는 여러 함수를 제공합니다.
  - Practical awk Programs는 많은 샘플 awk 프로그램을 제공합니다.

이 두 장을 읽으면 awk가 실제 문제를 해결하는 것을 볼 수 있습니다.

파트 III에서는 gawk에 특정한 기능에 중점을 둡니다. 다음 장으로 구성됩니다:
  - Advanced Features of gawk는 여러 고급 기능을 설명합니다. 특히 주목할 점은 배열 순회의 순서를 제어하고, 다른 프로세스와 양방향 통신을하고, TCP / IP 네트워킹을 수행하고, awk 프로그램을 프로파일링하는 기능입니다.
  - Internationalization with gawk는 런타임에 프로그램 메시지를 다른 언어로 변환하는 특수 기능을 설명합니다.
  - Debugging awk Programs는 gawk 디버거에 대해 설명합니다.
  - Namespaces in gawk는 gawk가 동일한 이름의 변수 및/또는 함수가 다른 네임 스페이스에 있도록 허용하는 방법을 설명합니다.
  - gawk를 사용한 산술 및 임의 정밀도 산술은 고급 산술 기능을 설명합니다.
  - gawk 용 확장 작성, C 또는 C ++로 확장을 작성하여 gawk에 새 변수 및 함수를 추가하는 방법을 설명합니다.

파트 IV는 각각 gawk 소스 코드와이 웹 페이지를 다루는 부록, 용어집 및 두 개의 라이센스를 제공합니다. 다음과 같은 부록이 포함되어 있습니다:
  - Evolution of the awk Language는 awk 언어가 처음 출시 된 이후 현재까지 어떻게 진화했는지 설명합니다. 또한 gawk가 시간이 지남에 따라 기능을 획득 한 방법도 설명합니다.
  - Installing gawk는 gawk 구하는 방법, POSIX 호환 시스템에서 컴파일하는 방법, 다른 비 POSIX 시스템에서 컴파일 및 사용하는 방법에 대해 설명합니다. 또한 gawk에서 버그를 보고하는 방법과 무료로 사용할 수 있는 다른 awk 구현을 얻을 수 있는 위치를 설명합니다.
  - Implementation Notes는 gawk 확장을 비활성화하는 방법과 gawk에 새 코드를 제공하는 방법 및 gawk 개발을위한 몇 가지 향후 방향을 설명합니다.
  - Basic Programming Concepts는 컴퓨터 프로그래밍에 완전히 익숙하지 않은 사람들을 위해 매우 간단한 배경 자료를 제공합니다.
  - The Glossary는 웹 페이지 전체에서 사용되는 중요한 용어의 전부는 아니지만 대부분을 정의합니다. 익숙하지 않은 용어를 찾으면 여기에서 찾아보세요.
  - GNU General Public License 및 GNU Free Documentation License는 각각 gawk 소스 코드와이 웹 페이지를 포함하는 라이센스를 제공합니다.

1 Getting Started with 'awk'
****************************
awk의 기본 기능은 특정 패턴을 포함하는 줄 (또는 다른 텍스트 단위)을 파일에서 검색하는 것입니다. 라인이 패턴 중 하나와 일치하면 awk는 해당 라인에서 지정된 작업을 수행합니다. awk는 입력 파일의 끝에 도달할 때까지 이러한 방식으로 입력 행을 계속 처리합니다. awk 프로그램은 데이터 기반이기 때문에 awk 프로그램은 대부분의 다른 언어 프로그램과 다릅니다 (즉, 작업하려는 데이터를 설명하고 찾은 경우 수행 할 작업). 대부분의 다른 언어는 절차적입니다. 프로그램이 취해야하는 모든 단계를 아주 자세하게 설명해야 합니다. 절차적 언어로 작업 할 때 일반적으로 프로그램이 처리할 데이터를 명확하게 설명하기가 훨씬 더 어렵습니다. 이러한 이유로 awk 프로그램은 종종 읽고 쓰기가 매우 쉽습니다. awk를 실행할 때 수행할 작업을 awk에게 알려주는 awk 프로그램을 지정합니다. 이 프로그램은 일련의 규칙으로 구성됩니다 (지금은 무시할 고급 기능인 함수 정의도 포함할 수 있습니다. 섹션 User-Defined Functions 참조). 각 규칙은 검색할 패턴 하나와 패턴을 찾을 때 수행 할 작업 하나를 지정합니다. 구문상 규칙은 패턴과 동작으로 구성됩니다. 동작은 패턴과 구분하기 위해 중괄호로 묶여 있습니다. 개행은 일반적으로 규칙을 구분합니다. 따라서 awk 프로그램은 다음과 같습니다:

PATTERN { ACTION }
PATTERN { ACTION }
...

1.1 How to Run 'awk' Programs
=============================
awk 프로그램을 실행하는 방법에는 여러 가지가 있습니다. 프로그램이 짧으면 다음과 같이 awk를 실행하는 명령에 포함하는 것이 가장 쉽습니다:

awk 'PROGRAM' INPUT-FILE1 INPUT-FILE2 ...


  프로그램이 길면 일반적으로 파일에 넣고 다음과 같은 명령으로 실행하는 것이 더 편리합니다:

awk -f PROGRAM-FILE INPUT-FILE1 INPUT-FILE2 ...


1.1.1 One-Shot Throwaway 'awk' Programs
---------------------------------------
awk에 익숙해지면, 사용하려는 순간에 간단한 프로그램을 입력하는 경우가 많습니다. 그런 다음, 다음과 같이 awk 명령의 첫 번째 인수로 프로그램을 작성할 수 있습니다:

awk 'PROGRAM' INPUT-FILE1 INPUT-FILE2 ...

여기서 PROGRAM은 앞에서 설명한대로 일련의 패턴과 작업으로 구성됩니다. 이 명령 형식은 쉘 또는 명령 인터프리터가 awk를 시작하고 PROGRAM을 사용하여 입력 파일의 레코드를 처리하도록 지시합니다. PROGRAM 주위에는 작은 따옴표가 있으므로 쉘은 awk 문자를 특수 쉘 문자로 해석하지 않습니다. 또한 따옴표를 사용하면 쉘이 모든 PROGRAM을 awk에 대한 단일 인수로 취급하고 PROGRAM이 한 줄 이상이 될 수도 있게 합니다. 이 형식은 awk 프로그램에 대해 별도의 파일이 필요하지 않기 때문에 쉘 스크립트에서 짧은 또는 중간 크기의 awk 프로그램을 실행하는데도 유용합니다. 잘못 배치할 다른 파일이 없기 때문에 자체 포함된 쉘 스크립트가 더 안정적입니다. 이 장의 뒷 부분에 있는 Some Simple Examples에서 몇 가지 간단한 자체 포함 프로그램의 예를 볼 수 있습니다.

1.1.2 Running 'awk' Without Input Files
---------------------------------------
입력 파일없이 'awk'를 실행할 수도 있습니다. 다음 명령 줄을 입력하는 경우 :

awk 'PROGRAM'


'awk'는 PROGRAM을 "표준 입력"에 적용하는데, 이는 일반적으로 키보드에 입력하는 모든 것을 의미합니다. 'Ctrl-d'를 입력하여 파일 끝을 표시 할 때까지 계속됩니다. (비 POSIX 운영 체제에서는 파일 끝 문자가 다를 수 있습니다.)
  예를 들어, 다음 프로그램은 컴퓨터 프로그래밍의 복잡성에 대해 걱정하지 않도록 Douglas Adams의 'The Hitchhiker 's Guide to the Galaxy'에서 나온 친절한 조언을 인쇄합니다:

$ awk 'BEGIN { print "Don\47t Panic!" }'
-| Don't Panic!

  'awk'는 입력을 읽기 전에 'BEGIN'과 관련된 문을 실행합니다. 프로그램에 다른 명령문이 없으면 여기 에서처럼 'awk'는 입력을 읽는 대신 처리 방법을 알지 못합니다. '\ 47'은 추악한 쉘 인용 트릭을 사용하지 않고도 프로그램에 작은 따옴표를 넣는 마법의 방법 (나중에 설명 됨)입니다.
    참고 : Bash를 셸로 사용하는 경우 이 프로그램을 대화식으로 실행하기 전에 'set + H'명령을 실행하여 '!'를 처리하는 C 셸 스타일 명령 기록을 비활성화해야 합니다. 특수 캐릭터로. 이 명령을 개인 시작 파일에 넣는 것이 좋습니다.
  다음 간단한 'awk'프로그램은 'cat'유틸리티를 에뮬레이트합니다. 키보드에 입력한 내용을 표준 출력으로 복사합니다 (이 작업이 작동하는 이유는 곧 설명합니다):

$ awk '{ print }'
Now is the time for all good men
-| Now is the time for all good men
to come to the aid of their country.
-| to come to the aid of their country.
Four score and seven years ago, ...
-| Four score and seven years ago, ...
What, me worry?
-| What, me worry?
Ctrl-d


1.1.3 Running Long Programs
---------------------------
때때로 'awk'프로그램은 매우 깁니다. 이러한 경우 프로그램을 별도의 파일에 저장하는 것이 더 편리합니다. 프로그램에 해당 파일을 사용하도록 'awk'에게 알리려면 다음을 입력합니다:

awk -f SOURCE-FILE INPUT-FILE1 INPUT-FILE2 ...


'-f'는 'awk'유틸리티가 SOURCE-FILE 파일에서 'awk'프로그램을 가져 오도록 지시합니다. SOURCE-FILE에는 모든 파일 이름을 사용할 수 있습니다. 예를 들어 다음과 같이 파일 'advice'에 다음 프로그램을 넣을 수 있습니다:

BEGIN { print "Don't Panic!" }

그러면 이 다음 명령은:

awk -f advice

다음 라인과 같은 같은 일을 합니다 :

awk 'BEGIN { print "Don\47t Panic!" }'

이것은 앞서 설명했습니다. 대부분의 파일 이름에는 셸의 특수 문자가 포함되어 있지 않기 때문에 일반적으로 '-f'로 지정한 파일 이름 주위에 작은 따옴표가 필요하지 않습니다. 'advice'에서 'awk'프로그램은 주위에 작은 따옴표가 없었습니다. 따옴표는 'awk'명령 줄에서 제공되는 프로그램에만 필요합니다. (또한 프로그램을 파일에 배치하면 마법 '\47'대신 프로그램 텍스트에 리터럴 작은 따옴표를 사용할 수 있습니다.)
  'awk'프로그램 파일을 명확하게 식별하려면 파일 이름에 '.awk'확장자를 추가 할 수 있습니다. 이것은 'awk'프로그램의 실행에 영향을 주지 않지만 "housekeeping"을 더 쉽게 만듭니다.

1.1.4 Executable 'awk' Programs
-------------------------------
'awk'를 배웠으면 '#!'를 사용하여 자체 포함 된 'awk'스크립트를 작성할 수 있습니다. 스크립트 메커니즘. 여러 시스템에서이 작업을 수행 할 수 있습니다. 예를 들어 'advice'파일을 다음과 같이 업데이트 할 수 있습니다.

#! / bin / awk -f 

BEGIN {print "Don't Panic!" }


이 파일을 실행가능하게 만든 후 ( 'chmod'유틸리티를 사용하여) 쉘에 'advice'를 입력하면 시스템은 마치 'awk -f advice'를 입력 한 것처럼 'awk'를 실행하도록 정렬합니다.

$ chmod + x advice
$ ./advice
-| Don't Panic!

자체 포함된 'awk'스크립트는 사용자가 프로그램이 'awk'로 작성되었음을 알지 못해도 호출할 수 있는 프로그램을 작성하려는 경우 유용합니다.

'#!'의 이해

'awk'는 "해석된" 언어입니다. 즉, 'awk'유틸리티가 프로그램을 읽고 프로그램의 지침에 따라 데이터를 처리합니다. (이것은 프로그램이 시스템의 프로세서에 의해 직접 실행되는 기계 코드로 처음 컴파일되는 C와 같은 "컴파일 된"언어와 다릅니다.) 따라서 'awk'유틸리티를 "인터프리터"라고합니다. 많은 현대 언어가 해석됩니다.
'#!'로 시작하는 라인은 실행할 인터프리터의 전체 파일 이름과 해당 인터프리터에 전달할 한 개의선택적 초기 명령 줄 인수를 나열합니다. 그런 다음 운영 체제는 주어진 인수와 실행된 프로그램의 전체 인수 목록을 사용하여 인터프리터를 실행합니다. 목록의 첫 번째 인수는 'awk'프로그램의 전체 파일 이름입니다. 나머지 인수 목록에는 'awk'에 대한 옵션이나 데이터 파일 또는 둘 다 포함됩니다. (많은 시스템에서 'awk'는 '/ bin'대신 '/ usr / bin'에 있습니다.)
일부 시스템은 인터프리터 이름의 길이를 32 자로 제한합니다. 종종 이것은 심볼릭 링크를 사용하여 처리 할 수 ​​있습니다.
'#!'이 있는 라인에 'awk'경로 다음에 하나 이상의 인수를 넣어서는 안됩니다. 이렇게 하면 작동하지 않습니다. 운영 체제는 나머지 줄을 단일 인수로 처리하고 'awk'에 전달합니다. 이렇게하면 혼란스러운 동작이 발생합니다. 대부분 'awk'의 usage diagnostic일 가능성이 높습니다.
마지막으로, 'ARGV [0]'의 값은 운영 체제에 따라 다릅니다. 일부 시스템은 거기에 'awk'를, 일부는 'awk'의 전체 경로 이름 (예 : '/ bin / awk')을, 일부 시스템은 스크립트 이름 ( 'advice')을 입력합니다. (d.c.) 'ARGV [0]'값에 의존하여 스크립트 이름을 제공하지 마십시오.

1.1.5 Comments in 'awk' Programs
--------------------------------
"주석"은 인간 독자를 위해 프로그램에 포함된 일부 텍스트입니다. 실제로 프로그램의 실행 가능한 부분이 아닙니다. 주석은 프로그램의 기능과 작동 방식을 설명할 수 있습니다. 거의 모든 프로그래밍 언어에는 주석이 없으면 일반적으로 이해하기 어렵기 때문에 주석에 대한 조항이 있습니다.
    'awk'언어에서 주석은 숫자 기호 문자 ( '#')로 시작하여 줄 끝까지 계속됩니다. '#'은 줄의 첫 번째 문자가 아니어도됩니다. 'awk'언어는 숫자 기호 뒤의 나머지 줄을 무시합니다. 예를 들어 다음을 'advice'에 넣을 수 있습니다:

# This program prints a nice, friendly message.  It helps
# keep novice users from being afraid of the computer.
BEGIN    { print "Don't Panic!" }

키보드로 작성한 일회용 'awk'프로그램에 여러 라인의 주석을 넣을 수 있지만 일반적으로 유용하지 않습니다. 주석의 목적은 나중에 읽을 때 본인 또는 다른 사람이 프로그램을 이해하도록 돕는 것입니다.
      주의 : 쉘 스크립트를 독립적으로 유지하기 위해 짧은 프로그램에서 중간 크기의 프로그램을 작은 따옴표로 묶을 수 있습니다. 그렇게 할 때 주석 (또는 프로그램의 다른 위치)에 어퍼스트로피 (즉, 작은 따옴표)를 넣지 마십시오. 쉘은 따옴표를 전체 프로그램에 대한 닫는 따옴표로 해석합니다. 결과적으로 일반적으로 쉘은 일치하지 않는 따옴표에 대한 메시지를 인쇄하고 'awk'가 실제로 실행되면 구문 오류에 대한 이상한 메시지를 인쇄 할 것입니다. 예를 들어, 다음을 보십시오:

$ awk 'BEGIN { print "hello" } # let's be cute'
>

    쉘은 처음 두 개의 따옴표가 일치하고 새 따옴표로 묶인 개체가 명령 줄의 끝에서 시작하는 것을 확인합니다. 따라서 추가 입력을 기다리는 보조 프롬프트로 프롬프트됩니다. Unix 'awk'에서 인용된 문자열을 닫으면 다음 결과가 생성됩니다:

$ awk '{ print "hello" } # let's be cute'
> '
error-> awk: can't open file be
error->  source line number 1

    'let 's'의 작은 따옴표 앞에 백 슬래시를 넣는 것은 도움이되지 않습니다. 왜냐하면 백 슬래시는 작은 따옴표 안에 특별하지 않기 때문입니다. 다음 노드는 쉘의 인용 규칙을 설명합니다.

1.1.6 Shell Quoting Issues
--------------------------
짧은 길이에서 중간 길이의 'awk'프로그램의 경우, 'awk'명령 줄에 프로그램을 입력하는 것이 가장 편리합니다. 전체 프로그램을 작은 따옴표로 묶는 것이 가장 좋습니다. 쉘 프롬프트에서 대화식으로 프로그램을 입력하든 더 큰 쉘 스크립트의 일부로 작성하든 마찬가지입니다:

awk 'PROGRAM TEXT' INPUT-FILE1 INPUT-FILE2 ...

   쉘로 작업하고 있으면, 쉘 인용 규칙에 대한 기본 지식이 있으면 도움이 됩니다. 다음 규칙은 POSIX 호환 Bourne 스타일 셸 (예 : Bash, GNU Bourne-Again 셸)에만 적용됩니다. C 셸을 사용하는 경우에는 그에 맞는 방법으로 해야 한다.
   규칙을 살펴보기 전에 이 Info 파일 전체에 나타나는 개념, 즉 "null"또는 빈 문자열 개념을 소개합니다.
   null 문자열은 값이 없는 문자 데이터입니다. 즉, 비어 있습니다. 다음과 같이 'awk'프로그램으로 작성됩니다 : ' "" '. 셸에서는 작은 따옴표 또는 큰 따옴표 ( ' "" '또는 '' '')를 사용하여 작성할 수 있습니다. null 문자열에는 문자가 없지만, 존재합니다. 예를 들어 다음 명령을 고려하십시오:

$ echo ""

여기서 'echo' 유틸리티는 인수에 문자가 없는 경우에도 단일 인수를 받습니다. 이 Info 파일의 나머지 부분에서는 "null 문자열"과 "빈 문자열"이라는 용어를 같은 의미로 사용합니다. 이제 인용 규칙을 살펴 보겠습니다.

   * 인용된 항목은 인용되지 않은 항목 및 기타 인용 된 항목과 연결될 수 있습니다. 쉘은 모든 것을 명령에 대한 하나의 인수로 바꿉니다.

   * 단일 문자 앞에 백슬래시 ( '\')가 있으면 해당 문자를 인용합니다. 쉘은 백슬래시를 제거하고 따옴표로 묶인 문자를 명령에 전달합니다.

   * 작은 따옴표는 여는 따옴표와 닫는 따옴표 사이의 모든 것을 보호합니다. 쉘은 인용된 텍스트를 해석하지 않고 그대로 명령에 전달합니다. 작은 따옴표 안에 작은 따옴표를 삽입하는 것은 불가능합니다. 

   * 큰 따옴표는 여는 따옴표와 닫는 따옴표 사이의 대부분을 보호합니다. 쉘은 인용된 텍스트에서 최소한 변수 및 명령 대체를 수행합니다. 다른 쉘은 큰 따옴표로 묶인 텍스트에 대해 추가 처리를 수행 할 수 있습니다.

     큰 따옴표로 묶인 텍스트 내의 특정 문자는 쉘에 의해 처리되기 때문에 텍스트 내에서 "이스케이프"되어야합니다. 주의 할 점은 '$', '`', '\'및 ' "'문자로, 문자 그대로 프로그램에 전달하려면 큰 따옴표로 묶인 텍스트 내에서 백 슬래시가 앞에 와야합니다. 선행 백 슬래시가 먼저 제거됩니다.) 따라서 다음 예제는:

awk 'BEGIN { print "Don\47t Panic!" }'

     다음과 같이 작성될 수 있습니다:

$ awk "BEGIN { print \"Don't Panic!\" }"
-| Don't Panic!

     참고로 작은 따옴표는 큰 따옴표 내에서 특별하지 않습니다.

   * Null 문자열은 null이 아닌 명령줄 인수의 일부로 발생하면 제거되고 명시적인 null 개체는 유지됩니다. 예를 들어, 필드 구분 기호 'FS'를 널 문자열로 설정하도록 지정하려면 다음을 사용하십시오:

awk -F "" 'PROGRAM' FILES # correct

     다음과 같이 사용하지 마십시오:

awk -F"" 'PROGRAM' FILES  # wrong!

     두 번째 경우 'awk'는 프로그램의 텍스트를 'FS'의 값으로 사용하고 첫 번째 파일 이름을 프로그램의 텍스트로 사용하려고 합니다! 이로 인해 구문 오류가 발생하고 최악의 경우 혼란스러운 동작이 발생합니다.

    작은 따옴표와 큰 따옴표를 혼합하는 것은 어렵습니다. 다음과 같이 쉘 인용 트릭에 의지해야 합니다:

$ awk 'BEGIN { print "Here is a single quote <'"'"'>" }'
-| Here is a single quote <'>

이 프로그램은 세 개의 연결된 따옴표 문자열로 구성됩니다. 첫 번째와 세 번째는 작은 따옴표이고 두 번째는 큰 따옴표입니다.

    이것은 다음과 같이 "단순화"될 수 있습니다:

$ awk 'BEGIN { print "Here is a single quote <'\''>" }'
-| Here is a single quote <'>

이 두 가지 중 어느 것이 더 읽기 쉬운 지 스스로 판단하십시오.

    또 다른 옵션은 큰 따옴표를 사용하여 포함 된 'awk'수준의 큰 따옴표를 이스케이프하는 것입니다:

$ awk "BEGIN { print \"Here is a single quote <'>\" }"
-| Here is a single quote <'>

이 옵션은 또한 큰 따옴표, 백슬래시 및 달러 기호가 고급 'awk' 프로그램에서 매우 일반적이기 때문에 고통스럽습니다.

    세 번째 옵션은 다음과 같이 작은 따옴표 및 큰 따옴표 문자에 해당하는 8진수의 이스케이프 시퀀스를 사용하는 것입니다:

$ awk 'BEGIN { print "Here is a single quote <\47>" }'
-| Here is a single quote <'>
$ awk 'BEGIN { print "Here is a double quote <\42>" }'
-| Here is a double quote <">

이것은 잘 작동하지만 이스케이프 시퀀스의 의미를 명확하게 설명해야 합니다.

    네 번째 옵션은 다음과 같이 명령줄 변수 할당을 사용하는 것입니다:

$ awk -v sq="'" 'BEGIN { print "Here is a single quote <" sq ">" }' 
-| Here is a single quote <'>                                       

(여기서 두 문자열 상수와 'sq'값은 'print'로 출력되는 단일 문자열로 연결됩니다.)

   'awk' 프로그램에 작은 따옴표와 큰 따옴표가 모두 필요한 경우에는 별도의 파일로 옮기는 것이 가장 좋습니다, 여기서 셸은 그림의 일부가 아니며, 이에 대해 의도하는 바를 말할 수 있어야 합니다.

1.1.6.1 Quoting in MS-Windows Batch Files
.........................................

이 Info 파일은 일반적으로 POSIX 시스템과 POSIX 쉘에 대해서만 걱정하지만 다음 문제는 많은 사용자에게 충분히 자주 발생하여 해결할 가치가 있습니다.

    Microsoft Windows 시스템의 "쉘"은 인용에 큰 따옴표 문자를 사용하므로 명령줄 스크립트에 이스케이프 된 큰 따옴표 문자를 포함하는 것이 어렵거나 불가능합니다. Jeroen Brink가 제공한 다음 예제는 큰 따옴표로 묶인 파일의 모든 행을 인쇄하는 이 한 줄짜리 스크립트에서,  큰 따옴표를 이스케이프하는 방법을 보여줍니다:

{ print "\"" $0 "\"" }

MS-Windows 명령줄에서 위의 한 줄짜리 스크립트는 다음과 같이 전달될 수 있습니다:

gawk "{ print \"\042\" $0 \"\042\" }" FILE

이 예에서 '\042'는 큰 따옴표에 대한 8 진수 코드입니다. 'gawk'는 'print'문에 의한 출력을 위해 실제 큰 따옴표로 변환합니다.

    MS-Windows에서는 큰 따옴표를 이스케이프하기 위해 백슬래시를 사용하기 때문에 큰 따옴표를 이스케이프하는 것이 약간 까다롭지만 백슬래시 자체는 일반적인 방식으로 이스케이프되지 않습니다. 실제로 그들은 후속 큰 따옴표가 있는지 여부에 따라 중복되거나 그렇지 않습니다. 문자열을 큰 따옴표로 묶는 MS-Windows 규칙은 다음과 같습니다.

   1. 원래 문자열의 각각의 큰 따옴표에 대해 N을 그 앞의 백슬래시 수라고 하며, N은 0이 될 수 있습니다. 이 N 개의 백 슬래시를 2 * N + 1 백슬래시로 바꿉니다.

   2. N을 원래 문자열을 뒤 따르는 백슬래시의 수라고하며 N은 0이 될 수 있습니다. 이 N 개의 백 슬래시를 2 * N 개의 백 슬래시로 바꿉니다.

   3. 결과 문자열을 큰 따옴표로 묶습니다.

    따라서 이전 예제에서 한 줄짜리 스크립트 '{ print "\"" $0 "\"" }'를 큰 따옴표로 묶으려면 다음과 같이 합니다:

gawk "{ print \"\\\"\" $0 \"\\\"\" }" FILE

그러나 '\\\"'대신 '\042'를 사용하는 것도 가능하고 읽기 쉽습니다. 왜냐하면 뒤에 큰 따옴표가 없는 백슬래시에는 중복이 필요하지 않기 때문입니다.

1.2 Data files for the Examples
===============================

이 Info 파일의 많은 예제는 두 개의 샘플 데이터 파일에서 입력을 받습니다. 첫 번째 'mail-list'는 이메일 주소 및 해당 사람들에 대한 정보와 함께 사람들의 이름 목록을 나타냅니다. 'inventory-shipped'라는 두 번째 데이터 파일에는 월별 배송 정보가 포함되어 있습니다. 두 파일 모두에서 각 행은 하나의 "레코드"로 간주됩니다.

    'mail-list'에서 각 레코드에는 사람의 이름, 전화 번호, 이메일 주소 및 목록 작성자와의 관계에 대한 코드가 포함됩니다. 열은 공백을 사용하여 정렬됩니다. 마지막 열에서 'A'는 그 사람이 지인임을 의미합니다. 마지막 열의 'F'는 그 사람이 친구임을 의미합니다. 'R'은 그 사람이 친척임을 의미합니다:

     Amelia       555-5553     amelia.zodiacusque@gmail.com    F
     Anthony      555-3412     anthony.asserturo@hotmail.com   A
     Becky        555-7685     becky.algebrarum@gmail.com      A
     Bill         555-1675     bill.drowning@hotmail.com       A
     Broderick    555-0542     broderick.aliquotiens@yahoo.com R
     Camilla      555-2912     camilla.infusarum@skynet.be     R
     Fabius       555-1234     fabius.undevicesimus@ucb.edu    F
     Julie        555-6699     julie.perscrutabor@skeeve.com   F
     Martin       555-6480     martin.codicibus@hotmail.com    A
     Samuel       555-3430     samuel.lanceolis@shu.edu        A
     Jean-Paul    555-2127     jeanpaul.campanorum@nyu.edu     R

'inventory-shipped' 데이터 파일은 연중 배송에 대한 정보를 나타냅니다. 각 기록에는 월, 배송된 녹색 상자 수, 배송된 빨간색 상자 수, 배송된 주황색 가방 수 및 배송된 파란색 패키지 수가 각각 포함됩니다. 작년 12 개월과 올해의 첫 4 개월을 포함하는 16 개의 항목이 있습니다. 빈 줄은 2 년 동안의 데이터를 구분합니다:

     Jan  13  25  15 115
     Feb  15  32  24 226
     Mar  15  24  34 228
     Apr  31  52  63 420
     May  16  34  29 208
     Jun  31  42  75 492
     Jul  24  34  67 436
     Aug  15  34  47 316
     Sep  13  55  37 277
     Oct  29  54  68 525
     Nov  20  87  82 577
     Dec  17  35  61 401

     Jan  21  36  64 620
     Feb  26  58  80 652
     Mar  24  75  70 495
     Apr  21  70  74 514

   샘플 파일은 'gawk'배포판에 포함되어 있는데, 'awklib/eg/data' 디렉토리에 위치합니다.

1.3 Some Simple Examples
========================

다음 명령은 입력 파일 'mail-list'에서 문자열 'li'를 검색하는 간단한 'awk'프로그램을 실행합니다 (문자 그룹은 일반적으로 "문자열"이라고합니다. "문자열"이라는 용어는 영어에서 사용하는 "진주열" 또는 "열차에 있는 자동차열"과 같은 비슷한 사용법에 기반합니다:

awk '/li/ { print $0 }' mail-list

'li'가 포함된 행이 발견되면 'print $0'은 현재 행을 출력한다는 의미이므로 출력됩니다.

    슬래시 ('/')가 'awk'프로그램에서 문자열 'li'를 둘러싸고 있음을 알 수 있습니다. 이 슬래시는 'li'가 검색할 패턴임을 나타냅니다. 이러한 유형의 패턴을 "정규식"이라고 하며 나중에 자세히 설명합니다. 패턴은 단어의 일부와 일치하는지 찾기위해 허용됩니다. 'awk' 프로그램 주위에는 작은 따옴표가 있으므로 쉘이 특수 쉘 문자로 해석하지 않습니다.

    이 프로그램이 출력하는 내용은 다음과 같습니다:

$ awk '/li/ { print $0 }' mail-list
-| Amelia       555-5553     amelia.zodiacusque@gmail.com    F
-| Broderick    555-0542     broderick.aliquotiens@yahoo.com R
-| Julie        555-6699     julie.perscrutabor@skeeve.com   F
-| Samuel       555-3430     samuel.lanceolis@shu.edu        A

   'awk'규칙에서는 패턴이나 작업을 생략할 수 있지만 둘 다 생략할 수는 없습니다. 패턴이 생략되면 모든 입력 라인에 대한 작업이 수행됩니다. 작업이 생략된 경우 기본 조치는 패턴과 일치하는 모든 행을 출력하는 것입니다.

   따라서 이전 예제에서 작업 ( 'print'문 및 중괄호)을 생략할 수 있으며 결과는 동일합니다. 'awk'는 'li'패턴과 일치하는 모든 행을 출력합니다. 이에 비해 'print'문을 생략하고 중괄호를 유지하면 아무 작업도 수행하지 않는 빈 작업이 생성됩니다 (즉, 행이 출력되지 않음).

   많은 실용적인 'awk'프로그램은 한두 줄에 불과합니다. 다음은 시작하는 데 도움이되는 유용한 짧은 프로그램 모음입니다. 이러한 프로그램 중 일부에는 아직 다루지 않은 구조가 포함되어 있습니다. (프로그램에 대한 설명은 무슨 일이 일어나고 있는 지에 대한 좋은 아이디어를 제공하지만 'awk'전문가가 되려면 나머지 Info 파일을 읽어야합니다!) 대부분의 예제는 'data'라는 이름의 데이터 파일을 사용합니다. 이것은 단지 placeholder입니다. 이러한 프로그램을 직접 사용하는 경우 'data'를 자신의 파일 이름으로 대체하십시오. 나중에 언급되겠지만, 참고로 'awk'에서 작업을 수행하는 방법이 한 가지 이상인 경우가 많습니다. 어떤 지점에서, 여기에 표시된 것과 동일한 작업을 수행하는 다른 방법을 찾을 수 있는지 이러한 예를 다시 살펴보고 확인하려 할 수 있을 것입니다.

   * 80자를 초과하는 모든 행을 출력하십시오:

awk 'length($0) > 80' data

     이 유일한 규칙에는, 패턴으로 관계식이 있고 작업이 없으므로 레코드를 출력하는 기본 작업을 사용합니다.

   * 가장 긴 입력 라인의 길이를 출력하십시오:

awk '{ if (length($0) > max) max = length($0) }
     END { print max }' data

     'END'와 관련된 코드는 모든 입력을 읽은 후에 실행됩니다. 'BEGIN'에 대한 동전의 반대편입니다.

   * 'data'에서 가장 긴 라인의 길이를 출력하십시오:

expand data | awk '{ if (x < length($0)) x = length($0) }
                   END { print "maximum line length is " x }'

     이 예제는 이전의 것과 약간 다릅니다: 입력이 탭 문자들을 스페이스 문자들로 변경하기 위해 'expand' 유틸리티가 사용되었습니다, 따라서 비교되는 너비는 실제로 각 행의 입력 문자 수가 아니라 오른쪽 여백 열입니다.

   * 적어도 하나의 필드를 가지는 모든 라인을 출력하십시오:

awk 'NF > 0' data

     이것은 파일에서 빈 줄을 삭제하는 쉬운 방법입니다 (또는 이전 파일과 비슷하지만 빈 줄이 제거된 새 파일을 만드는 것).

   * 0에서 100까지, 중복을 포함하여 7개의 난수를 출력하십시오:

awk 'BEGIN { for (i = 1; i <= 7; i++)
           print int(101 * rand()) }'

   * FILES에 사용된 바이트의 수를 출력하십시오:

ls -l FILES | awk '{ x += $5 }
                   END { print "total bytes: " x }'

   * FILES에 사용된 총 킬로바이트를 출력하십시오:

ls -l FILES | awk '{ x += $5 }
    END { print "total K-bytes:", x / 1024 }'

   * 모든 user들의 login 이름을 정렬하여 출력하십시오:

awk -F: '{ print $1 }' /etc/passwd | sort

   * 한 파일의 라인수를 세어보십시오:

awk 'END { print NR }' data

   * data 파일에서 짝수 라인을 출력하십시오:

awk 'NR % 2 == 0' data

     만약 'NR % 2 == 1' 표현식을 사용했다면, 프로그램은 홀수 라인을 출력할 것입니다.

1.4 An Example with Two Rules
=============================

'awk' 유틸리티는 입력 파일을 한 번에 한 줄씩 읽습니다. 각 줄에 대해 'awk'는 각 규칙의 패턴을 시도합니다. 여러 패턴이 일치하면 'awk' 프로그램에 나타나는 순서대로 여러 작업이 실행됩니다. 일치하는 패턴이 없으면 작업이 실행되지 않습니다.

    줄과 일치하는 모든 규칙을 처리한 후 (아마도 없을 수도 있음) 'awk'는 다음 줄을 읽습니다. 이것은 프로그램이 파일의 끝에 도달할 때까지 계속됩니다. 예를 들어 다음 'awk'프로그램에는 두 가지 규칙이 있습니다:

/12/  { print $0 }
/21/  { print $0 }

첫 번째 규칙에는 패턴으로 '문자열 12'가 있고 작업으로 'print $0'가 있습니다. 두 번째 규칙에는 패턴으로 문자열 '21'이 있고 작업으로 'print $ 0'도 있습니다. 각 규칙의 작업은 자체 중괄호 쌍으로 묶여 있습니다.

    이 프로그램은 문자열 '12' 또는 문자열 '21'을 포함하는 모든 행을 출력합니다. 행에 두 문자열이 모두 포함되어 있으면 각 규칙에 따라 한 번씩 두 번 출력됩니다.

    두 개의 샘플 데이터 파일 'mail-list'와 'inventory-shipped'에 대해 이 프로그램을 실행하면 다음과 같은 일이 발생합니다.

$ awk '/12/ { print $0 }
>      /21/ { print $0 }' mail-list inventory-shipped
-| Anthony      555-3412     anthony.asserturo@hotmail.com   A
-| Camilla      555-2912     camilla.infusarum@skynet.be     R
-| Fabius       555-1234     fabius.undevicesimus@ucb.edu    F
-| Jean-Paul    555-2127     jeanpaul.campanorum@nyu.edu     R
-| Jean-Paul    555-2127     jeanpaul.campanorum@nyu.edu     R
-| Jan  21  36  64 620
-| Apr  21  70  74 514

'mail-list'에서 'Jean-Paul'으로 시작하는 줄이 각 규칙에 대해 한 번씩 두 번 출력된 것에 유의하십시오.

1.5 A More Complex Example
==========================

이제 몇 가지 간단한 작업을 마스터 했으므로 일반적인 'awk' 프로그램이 수행하는 작업을 살펴 보겠습니다. 이 예는 'awk'를 사용하여 다른 유틸리티의 출력을 요약, 선택 및 재배열하는 방법을 보여줍니다. 아직 다루지 않은 기능을 사용하므로 모든 세부 사항을 이해하지 못하더라도 걱정하지 마십시오:

ls -l | awk '$6 == "Nov" { sum += $5 }
            END { print sum }'

   이 명령은 11 월 (연도)에 마지막으로 수정된 현재 디렉토리의 모든 파일에 있는 총 바이트 수를 출력합니다. 이 예제의 'ls -l'부분은 각 파일의 크기와 파일이 마지막으로 수정된 날짜를 포함하여 디렉토리의 파일 목록을 제공하는 시스템 명령입니다. 출력은 다음과 같습니다:

     -rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
     -rw-r--r--  1 arnold   user  10809 Nov  7 13:03 awk.h
     -rw-r--r--  1 arnold   user    983 Apr 13 12:14 awk.tab.h
     -rw-r--r--  1 arnold   user  31869 Jun 15 12:20 awkgram.y
     -rw-r--r--  1 arnold   user  22414 Nov  7 13:03 awk1.c
     -rw-r--r--  1 arnold   user  37455 Nov  7 13:03 awk2.c
     -rw-r--r--  1 arnold   user  27511 Dec  9 13:07 awk3.c
     -rw-r--r--  1 arnold   user   7989 Nov  7 13:03 awk4.c

첫 번째 필드에는 읽기-쓰기 권한이 포함되고 두 번째 필드에는 파일에 대한 링크 수가 포함되며 세 번째 필드는 파일 소유자를 식별합니다. 네 번째 필드는 파일의 그룹을 식별합니다. 다섯 번째 필드에는 파일 크기 (바이트)가 포함됩니다. 여섯 번째, 일곱 번째 및 여덟 번째 필드에는 파일이 마지막으로 수정된 월, 일 및 시간이 각각 포함됩니다. 마지막으로 아홉 번째 필드에는 파일 이름이 포함됩니다.

   'awk' 프로그램의 '$6 == "Nov"'는 'ls -l'출력의 여섯 번째 필드가 문자열 'Nov'와 일치하는지 여부를 테스트하는 표현식입니다. 줄의 여섯 번째 필드에 'Nov'문자열이 있을 때마다 'awk'는 'sum += $5' 작업을 수행합니다. 그러면 변수 'sum'에 다섯 번째 필드(파일의 크기)가 추가됩니다. 결과적으로 'awk'가 모든 입력 행을 읽었을 때 'sum'은 행이 패턴과 일치하는 파일 크기의 합계입니다. ( 'awk'변수가 자동으로 0으로 초기화되기 때문에 이와 같이 작동합니다.)

   'ls'의 마지막 출력 라인이 처리 된 후 'END'규칙이 실행되고 'sum'값을 출력합니다. 이 예에서 'sum'의 값은 80600입니다.

   이러한 고급 'awk' 기술은 이후의 부 노드에서 다룹니다. 고급 'awk'프로그래밍으로 넘어가려면 먼저 'awk'가 입력을 해석하고 출력을 표시하는 방법을 알아야 합니다. 필드를 조작하고 'print'문을 사용하면 매우 유용하고 인상적인 보고서를 생성할 수 있습니다.
   
1.6 'awk' Statements Versus Lines
=================================

대부분의 경우. 'awk'프로그램의 각 줄은 다음과 같이 별도의 문 또는 별도의 규칙입니다:

awk '/12/  { print $0 }
     /21/  { print $0 }' mail-list inventory-shipped

   그러나 'gawk'는 다음 기호 및 키워드 뒤의 개행 문자를 무시합니다:

,    {    ?    :    ||    &&    do    else

다른 지점의 개행은 명령문의 끝으로 간주됩니다.

개행으로 끝나는 지점에서 단일 명령문을 두 줄로 분할하려면 첫 번째 줄을 백슬래시 문자 ('\')로 끝내서 "계속"할 수 있습니다. 연속 문자로 인식되려면 백슬래시가 행의 마지막 문자 여야합니다. 백슬래시 뒤에 개행 문자가 오는 것은 명령문의 모든 위치에서 허용되는데, 문자열이나 정규식의 중간에서도 가능합니다. 예를 들면 :

awk '/This regular expression is too long, so continue it\
 on the next line/ { print $1 }'

우리는 일반적으로 샘플 프로그램에서 백슬래시을 이용한 라인의 연속을 사용하지 않았습니다. 'gawk'는 행의 길이에 제한을 두지 않으므로 백슬래시을 이용한 라인의 연속이 반드시 필요하지 않습니다. 이것은 프로그램을 더 읽기 쉽게 만듭니다. 명확성 뿐만 아니라 이와 같은 이유로, Info 파일 전체에 제시된 프로그램에서 대부분의 명령문을 짧게 유지했습니다.

   백슬래시을 이용한 라인의 연속은 'awk' 프로그램이 명령 줄에서 입력하는 대신 별도의 소스 파일에 있을 때 가장 유용합니다. 또한 많은 'awk'구현이 백슬래시을 이용한 라인의 연속을 사용할 수 있는 위치에 대해 더 구체적이라는 점에 유의해야 합니다. 예를 들어 백슬래시을 이용한 라인의 연속을 사용하여 문자열 상수를 분할 할 수 없습니다. 따라서 'awk' 프로그램의 최대 이식성을 위해 정규식이나 문자열 중간에서 줄을 분할하지 않는 것이 가장 좋습니다.

     주의 : 백슬래시을 이용한 라인의 연속은 C 셸에서 설명한 대로 작동하지 않습니다. 파일에서 동작하는 'awk'프로그램 및 Unix Bourne 셸 또는 Bash와 같은 POSIX 호환 셸을 사용하는 원샷 프로그램의 경우 이 기능이 작동합니다. 그러나 C 쉘은 다르게 작동합니다! 여기에서 두 개의 백슬래시를 연속으로 사용하고 그 뒤에 개행 문자를 사용해야 합니다. 또한 C 셸을 사용할 때 'awk' 프로그램의 모든 개행 문자는 백슬래시로 이스케이프 처리되어야합니다. 설명하기 위해 다음 예를 보면:

% awk 'BEGIN { \
?   print \\
?       "hello, world" \
? }'
-| hello, world

      여기에서 '%'와 '?'는 C 쉘의 기본 및 보조 프롬프트로 표준 쉘의 '$'및 '>'와 유사합니다.

      이전 예제를 POSIX 호환 쉘에서 수행하는 방법과 비교하십시오:

$ awk 'BEGIN {
>   print \
>       "hello, world"
> }'
-| hello, world

    'awk'는 라인 지향 언어입니다. 각 규칙의 작업은 패턴과 같은 줄에서 시작되어야 합니다. 패턴과 동작을 별도의 줄에 표시하려면 백슬래시을 이용한 라인의 연속을 반드시 사용해야합니다. 다른 옵션은 없습니다.

    명심해야 할 또 다른 사항은 백슬래시을 이용한 라인의 연속과 주석이 섞이지 않는다는 것입니다. 'awk'는 주석을 시작하는 '#'을 보는 즉시 나머지 줄의 모든 것을 무시합니다. 예를 들면 :

$ gawk 'BEGIN { print "dont panic" # a friendly \
>                                    BEGIN rule
> }'
error-> gawk: cmd. line:2:                BEGIN rule
error-> gawk: cmd. line:2:                ^ syntax error

이 경우 백슬래시가 주석을 다음 줄까지 계속하는 것처럼 보입니다. 그러나 백슬래시-개행 조합은 주석 내부에 "숨겨져"있기 때문에 눈에 띄지 않습니다. 따라서 'BEGIN'은 구문 오류로 표시됩니다.

    한 규칙 내에서 'awk'문이 짧으면 한 줄에 둘 이상의 명령문을 넣을 수 있습니다. 세미콜론 ( ';')으로 명령문을 구분하면 됩니다. 이것은 규칙 자체에도 적용됩니다. 따라서 이 노드의 시작 부분에 표시된 프로그램도 다음과 같이 작성할 수 있습니다:

/12/ { print $0 } ; /21/ { print $0 }

참고 : 동일한 줄의 규칙을 세미콜론으로 구분해야 한다는 요구 사항은 원래 'awk'언어가 아닙니다. 작업 내에서 명령문 처리와 일관성을 위해 추가되었습니다.

1.7 Other Features of 'awk'
===========================

'awk'언어는 프로그램이 'awk'에서 정보를 가져 오는 데 사용할 수있는 미리 정의 된 또는 "내장"변수를 제공합니다. 'awk'가 데이터를 처리하는 방법을 제어하기 위해 프로그램에서 설정할 수있는 다른 변수도 있습니다.

    또한 'awk'는 일반적인 계산 및 문자열 관련 작업을 수행하기 위한 여러 내장 함수를 제공합니다. 'gawk'는 타임 스탬프 작업, 비트 조작 수행, 런타임 문자열 변환 (국제화), 변수 유형 결정 및 배열 정렬을 위한 내장 함수를 제공합니다.

1.8 When to Use 'awk'
=====================

이제 'awk'가 무엇을 할 수 있는지 살펴보았으므로 'awk'가 어떻게 유용 할 수 있는지 궁금할 것입니다. 유틸리티 프로그램, 고급 패턴, 필드 구분 기호, 산술 명령문 및 기타 선택 기준을 사용하여 훨씬 더 복잡한 출력을 생성할 수 있습니다. 'awk'언어는 'ls'와 같은 다른 유틸리티 프로그램의 출력 정보를 요약하는 것과 같이 대량의 raw 데이터에서 보고서를 생성하는 데 매우 유용합니다.

   'awk'로 작성된 프로그램은 일반적으로 다른 언어보다 훨씬 작습니다. 따라서 'awk' 프로그램을 쉽게 구성하고 사용할 수 있습니다. 종종 'awk' 프로그램은 키보드에서 빠르게 작성하여 한 번만 사용하고 버릴 수 있습니다. 'awk'프로그램은 해석되기 때문에 소프트웨어 개발의 일반적인 편집-컴파일-테스트-디버그주기의 (보통 긴) 컴파일 부분을 피할 수 있습니다.

   8 비트 마이크로 프로세서를 위한 완전한 재 타겟팅 가능한 어셈블러를 포함하여, 복잡한 프로그램들이 'awk'로 작성되었습니다. 원래의 'awk'기능은 이러한 복잡한 작업으로 인해 부담이 있었지만, 최신 버전은 더 많은 기능을 제공합니다.

   예를 들어 수백 줄 이상의 'awk'스크립트를 작성하는 경우 다른 프로그래밍 언어를 사용하는 것이 좋습니다. 쉘은 문자열과 패턴 일치에 능합니다. 또한 시스템 유틸리티를 강력하게 사용할 수 있습니다. 파이썬은 높은 수준의 프로그래밍 용이성과 시스템 시설에 대한 접근 사이에 좋은 균형을 제공합니다.
 
1.9 Summary
===========

   * 'awk'의 프로그램은 패턴-작업 쌍으로 구성됩니다.

   * 패턴이 없는 작업은 항상 실행됩니다. 패턴이 없으면, 패턴의 기본 작업은 '{ print $0 }'입니다.

   * 'awk'를 실행하려면 'awk 'PROGRAM' FILES' 또는 'awk -f PROGRAM-FILE FILES'를 사용하십시오.

   * 직접 실행 가능한 'awk' 프로그램을 만들기 위한 특수한 '#!' 헤더 라인을 사용할 수 있습니다.

   * 'awk' 프로그램의 주석은 '#'로 시작하여 같은 줄 끝까지 계속됩니다.

   * 더 큰 셸 스크립트 (또는 MS-Windows 배치 파일)의 일부로 'awk' 프로그램을 작성할 때 인용 문제에 유의하십시오.

   * 백슬래시를 이용한 줄의 연속을 사용하여 소스 행을 계속할 수 있습니다. 쉼표, 여는 중괄호, 물음표, 콜론, '||', '&&', 'do'및 'else' 뒤에 개행이 있으면 줄은 자동으로 계속됩니다.

반응형

'programming > awk' 카테고리의 다른 글

[awk 예제] line number 와 함께 내용 출력  (0) 2021.01.30
[awk 예제] 중복라인 제거  (0) 2021.01.30
[awk 예제] line count  (0) 2021.01.30