Jump to content

AWK

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning
AWK
ParadigmScripting, procedural, data-driven[1]
Designed byAlfred Aho, Peter Weinberger, and Brian Kernighan
First appeared1977; 47 years ago (1977)
Stable release
IEEE Std 1003.1-2008 (POSIX) / 1985
Typing disciplinenone; can handle strings, integers and floating-point numbers; regular expressions
OSCross-platform
Major implementations
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (compiler), Awka (compiler)
Dialects
old awk oawk 1977, new awk nawk 1985, GNU Awk gawk
Influenced by
C, sed, SNOBOL[2][3]
Influenced
Tcl, AMPL, Perl, Korn Shell (ksh93, dtksh, tksh), Lua

AWK (awk)[4]는 텍스트 처리를 위해 설계된 도메인-지정 언어이고 전형적으로 데이터 추출 및 보고 도구로 사용됩니다. sedgrep처럼, 그것은 하나의 필터이고,[4] 대부분의 유닉스-계열 운영 시스템의 표준 기능입니다.

AWK 언어는 형식화된 보고서를 생성하는 것과 같은 텍스트를 추출하거나 변환하기 위해 – 파일에서 직접 실행되거나 파이프라인의 일부로 사용되는 – 텍스트 데이터의 스트림에 대해 수행될 일련의 동작으로 구성된 데이터-기반 스크립팅 언어입니다. 그 언어는 문자열 데이터유형, 연관 배열 (즉, 키 문자열로 인덱싱된 배열), 및 정규 표현식을 광범위하게 사용합니다. AWK는 제한된 의도된 응용 프로그램 도메인을 가지고 특히 한-줄짜리 프로그램을 지원하도록 설계되었지만, 그 언어는 Turing-complete이고, 심지어 AWK의 초기 Bell Labs 사용자조차도 종종 잘-구성된 대규모 AWK 프로그램을 작성했습니다.[5]

AWK는 1970년대에 Bell Labs에서 만들어졌었고,[6] 그것의 이름은 그것의 저자: Alfred Aho, Peter Weinberger, 및 Brian Kernighan에서 따왔습니다. 두문자어는 AWK 프로그래밍 언어의 표지에 있는 새 auk와 동일하게 발음됩니다.[7] awk와 같이 모두 소문자로 작성될 때, 그것은 AWK 프로그래밍 언어로 작성된 스크립트를 실행하는 유닉스 또는 Plan 9 프로그램을 참조합니다.

History

AWK는 1977년 Alfred Aho (egrep의 저자), Peter J. Weinberger (작은 관계형 데이터베이스에서 작업했던 사람), 및 Brian Kernighan에 의해 처음 개발되었습니다; 그것은 각각의 초성에서 이름을 따왔습니다. Kernighan에 따르면, AWK의 목표 중 하나는 숫자와 문자열 둘 다를 쉽게 조작할 수 있는 도구를 만드는 것이었습니다. AWK는 역시 입력 데이터에서 패턴을 검색하기 위해 사용되었고, yacc를 사용하여 구현되었던 Marc Rochkind의 프로그래밍 언어에서 영감을 받았습니다.[8]

버전 7 유닉스에 나타난 초기 도구 중 하나로서, AWK는 표준 유닉스 환경에서 사용할 수 있는 유일한 스크립팅 언어, Bourne 쉘 외에 유닉스 파이프라인에 계산 기능을 추가했습니다. 그것은 단일 유닉스 사양의 필수 유틸리티 중 하나이고,[9] 리눅스 표준 기본 사양에 필요합니다.[10]

AWK는 1985–88년에 크게 다시-고안되었고 확장되었으며, Paul Rubin, Jay Fenlason, 및 Richard Stallman에 의해 작성된, 1988년에 출시된, GNU AWK 구현을 초래합니다.[11] GNU AWK는 GNU-기반 리눅스 패키지에 포함되어 있기 때문에 가장 널리 배포된 버전일 수 있습니다.[12] GNU AWK는 1994년부터 Arnold Robbins에 의해 단독으로 유지 관리되었습니다.[11] Brian Kernighannawk (New AWK) 소스는 1993년에 공개되지 않은 상태로 처음 출시되었고, 1990년대 후반부터 공개되었습니다; 많은 BSD 시스템은 GPL 라이센스를 피하기 위해 이것을 사용합니다.[11]

AWK는 sed (1974)에 의해 선행되었습니다. 둘 다 텍스트 처리를 위해 설계되었습니다. 그것들은 행-지향, 데이터-기반 패러다임을 공유하고, 암시적인 메인 루프와 현재 줄 변수로 인해 한-줄짜리 프로그램을 작성하기 위해 특히 적합합니다. 당시 AWK의 한계와 함께 초기 AWK 프로그램의 강력함과 간결함 – 특히 강력한 정규식 처리 및 한줄-라이너를 용이하게 하는 암시적 변수로 인한 간결함 – 은 Perl 언어 (1987)에 중요한 영감을 주었습니다. 1990년대에, Perl은 유닉스 텍스트-처리 언어의 틈새 시장에서 AWK와 경쟁하면서 매우 인기를 얻었습니다.

Structure of AWK programs

AWK는 한 번에 한 줄씩 입력을 읽습니다. 한 줄은 프로그램에서 각 패턴에 대해 스캔되고, 일치하는 각 패턴에 대해, 결합된 동작이 실행됩니다.

— Alfred V. Aho[13]

AWK 프로그램은 다음과 같이 작성된 일련의 패턴 동작 쌍입니다:

condition { action }
condition { action }
...

여기서 condition은 전형적으로 표현식이고 action은 일련의 명령입니다. 그 입력은 레코드로 분할되며, 여기서 기본적으로 레코드는 입력이 줄들로 분리되도록 줄 바꿈 문자로 구분됩니다. 그 프로그램은 각 조건에 대해 각 레코드를 차례로 테스트하고, 참인 각 표현식에 대한 action을 실행합니다. 조건 또는 동작은 생략될 수 있습니다. 조건은 기본적으로 모든 각 레코드와 일치하도록 설정됩니다. 기본 동작은 레코드를 인쇄하는 것입니다. 이것은 sed와 같은 패턴-액션 구조입니다.

foo == 1 또는 /^foo/와 같은 간단한 AWK 표현식 외에도, 조건은 모든 레코드를 읽기 전이나 후에, 이후 행에서 pattern1과 다시 일치를 시도하기 전에 pattern1과 일치하는 레코드로 시작하여 pattern2와 일치하는 레코드를 포함하는 레코드 범위와 일치하는 pattern1, pattern2에서 실행되는 원인을 제공하는 BEGIN 또는 END가 될 수 있습니다.

보통 산술 및 논리 연산자 외에도, AWK 표현식은 문자열에 대해 정규 표현식과 일치시하는 물결표 연산자, ~를 포함합니다. 능숙한 syntactic sugar로서, 물결표 연산자 사용없이 /regexp/는 현재 레코드와 일치합니다; 이 구문은 sed에서 파생되며, sed는 차례로 ed 편집기로부터 그것을 상속하며, 여기서 /는 검색에 대해 사용됩니다. 슬래시를 정규식에 대해 구분 기호로 사용하는 이 구문은 이후 PerlECMAScript에 채택되었고, 이제는 일반적입니다. 물결표 연산자는 역시 Perl에서도 채택되었습니다.

Commands

AWK 명령은 위의 예에서 action을 대체하는 명령문입니다. AWK 명령은 함수 호출, 변수 할당, 계산, 또는 이들의 임의의 조합을 포함할 수 있습니다. AWK는 많은 함수에 대해 내장 지원을 포함하고 있습니다; 더 많은 것이 AWK의 다양한 버전에 의해 제공됩니다. 역시, 일부 버전은 더 많은 함수를 제공할 수 있는 동적으로 연결된 라이브러리의 포함을 지원합니다.

The print command

print 명령은 텍스트를 출력하기 위해 사용됩니다. 출력 텍스트는 항상 기본값이 줄 바꿈인 출력 레코드 구분 기호 (ORS)라는 미리-정의된 문자열로 종료됩니다. 이 명령의 가장 간단한 형식은 다음과 같습니다:

print
이것은 현재 레코드의 내용을 표시합니다. AWK에서, 레코드는 fields로 분류되고, 이것들은 별도로 표시될 수 있습니다:
print $1
현재 레코드의 첫 번째 필드를 표시합니다.
print $1, $3
기본값이 단일 스페이스 문자인 출력 필드 구분 기호 (OFS)라는 미리-정의된 문자열로 구분된 현재 레코드의 첫 번째 및 세 번째 필드를 표시합니다.

비록 이들 필드 ($X)는 변수와 유사할 수 있지만 ($ 기호는 Perl에서 변수를 나타냄), 그것들은 실제로 현재 레코드의 필드를 참조합니다. 특별한 경우, $0은 전체 레코드를 참조합니다. 사실, "print" 및 "print $0" 명령은 기능면에서 동일합니다.

print 명령은 계산 및/또는 함수 호출의 결과를 표시할 수도 있습니다:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print 3+2
    print foobar(3)
    print foobar(variable)
    print sin(3-2)
}

출력은 파일로 보낼 수 있습니다:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" > "file name"
}

또는 파이프를 통해:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" | "command"
}

Built-in variables

Awk의 내장 변수는 $1, $2, $3, 등의 필드 변수를 포함합니다 ($0는 전체 레코드를 나타냅니다). 그것들은 레코드에서 개별 텍스트-필드에 텍스트 또는 값을 보유합니다.

다른 변수는 다음을 포함합니다:

  • NR: 레코드의 개수. 모든 데이터 파일에서 지금까지 읽은 입력 레코드 개수의 현재 카운트를 유지합니다. 그것은 영에서 시작하지만, 자동으로 영으로 재설정되지는 않습니다.[14]
  • FNR: 레코드의 파일 번호. 현재 파일에서 지금까지 읽은 입력 레코드 개수의 현재 카운트를 유지합니다. 이 변수는 새 파일이 시작될 때마다 자동으로 영으로 재설정됩니다.[14]
  • NF: 필드의 개수. 현재 입력 레코드에서 필드의 개수를 포함합니다. 입력 레코드에서 마지막 필드는 $NF, 마지막에서 두 번째 필드는 $(NF-1), 세 번째 필드는 $(NF-2), 등으로 지정될 수 있습니다.
  • FILENAME: 현재 입력 파일의 이름을 포함합니다.
  • FS: 필드 구분 기호. 입력 레코드에서 필드를 나누기 위해 사용되는 "필드 구분 기호" 문자를 포함합니다. 기본값, "공백"은 임의의 스페이스 및 탭 문자를 포함합니다. FS는 필드 구분 기호를 변경하기 위해 다른 문자에 재할당될 수 있습니다.
  • RS: 필드 구분 기호. 입력 레코드에서 필드를 나누기 위해 사용되는 "필드 구분 기호" 문자를 포함합니다. 기본값, "공백"은 스페이스 및 탭 문자를 포함합니다. FS는 필드 구분 기호를 변경하기 위해 다른 문자에 재할당될 수 있습니다.
  • OFS: 출력 필드 구분 기호. Awk가 필드를 인쇄할 때 필드를 구분하는 "출력 필드 구분 기호"를 저장합니다. 기본값은 "스페이스" 문자입니다.
  • ORS: 출력 레코드 구분 기호. Awk가 출력 레코드를 인쇄할 때 출력 레코드를 구분하는 "출력 레코드 구분 기호"를 저장합니다. 기본값은 "새 줄" 문자입니다.
  • OFMT: 출력 형식. 숫자 출력 형식을 저장합니다. 기본 형식은 "%.6g"입니다.

Variables and syntax

변수 이름은 언어 키워드를 제외하고 [A-Za-z0-9_] 문자의 임의의 것을 사용할 수 있습니다. 연산자 + - * /는 각각 더하기, 빼기, 곱하기, 및 나누기를 나타냅니다. 문자열 연쇄에 대해, 두 개의 변수 (또는 문자열 상수)를 서로 옆에 배치하기만 하면 됩니다. 문자열 상수가 포함되면 사이에 스페이스를 사용하는 것은 선택 사항이지만, 서로 인접하게 배치된 두 변수 이름에는 사이에 스페이스가 필요합니다. 큰따옴표는 문자열 상수를 구분합니다. 명령문은 세미콜론으로 끝날 필요가 없습니다. 마지막으로, 주석은 #을 줄의 첫 번째 문자로 사용함으로써 프로그램에 더해질 수 있습니다.

User-defined functions

C와 유사한 형식에서, 함수 정의는 키워드 function, 함수 이름, 인수 이름 및 함수 본문으로 구성됩니다. 다음은 함수의 예입니다

function add_three (number) {
    return number + 3
}

이 명령문은 다음과 같이 호출할 수 있습니다:

(pattern)
{
   print add_three(36)     # Outputs '''39'''
}

함수는 로컬 범위에 있는 변수를 가질 수 있습니다. 이것들의 이름은 인수 목록의 끝에 추가되지만, 함수를 호출할 때 이들에 대한 값은 생략되어야 합니다. 매개변수가 끝나고 지역 변수가 시작되는 위치를 나타내기 위해, 지역 변수 앞에 인수 목록에 공백을 추가하는 것이 관례입니다.

Examples

Hello World

다음은 AWK로 작성된 관례적인 "Hello, world" 프로그램입니다:

BEGIN { print "Hello, world!" }

여기에는 명시적인 exit 문이 필요하지 않음을 주목하십시오; 유일한 패턴은 BEGIN이므로, 명령줄 인수가 처리되지 않습니다.

Print lines longer than 80 characters

80자보다 긴 모든 줄을 인쇄합니다. 기본 동작은 현재 줄을 인쇄하는 것임을 주목하십시오.

length($0) > 80

Count words

입력의 단어 수를 세고 줄, 단어 및 문자 수 (예를 들어, wc)를 인쇄합니다:

{
    words += NF
    chars += length + 1 # add one to account for the newline character at the end of each record (line)
}
END { print NR, words, chars }

프로그램의 첫 번째 줄에는 패턴이 없으므로, 기본적으로 모든 각 입력 줄이 일치하므로, 모든 각 줄에 대해 증분 작업이 실행됩니다. words += NFwords = words + NF의 약어임을 주목하십시오.

Sum last word

{ s += $NF }
END { print s + 0 }

s는 AWK의 필드 구분 기호 (기본적으로, 공백)에 의해 정의된 줄의 마지막 단어인 $NF의 숫자 값만큼 증가합니다. NF는 현재 줄의 필드 개수, 예를 들어, 4입니다. $4는 네 번째 필드의 값이므로, $NF는 이 줄의 필드 개수 또는 또는 그것이 주변 줄보다 더 많은 필드 또는 더 적은 필드가 있는지 여부에 관계없이 줄의 마지막 필드 값입니다. $는 실제로 가장 높은 연산자 우선 순위를 갖는 단항 연산자입니다. (만약 줄이 필드를 가지지 않으면, NF는 0이고, $0은 전체 줄이며, 이 경우에서 가능한 공백을 제외하고 비어 있고, 따라서 숫자 값 0을 가집니다.)

입력이 끝에서 END 패턴이 일치하므로, s가 인쇄됩니다. 어쨌든, 입력 줄이 전혀 없을 수 있으므로, 이 경우에서 값이 s에 할당되지 않으며, 기본적으로 빈 문자열이 될 것입니다. 변수에 영을 더하는 것은 문자열에서 숫자 값으로 강제 변환하는 AWK 관용구입니다. (빈 문자열을 연쇄하는 것은 숫자에서 문자열, 예를 들어, s ""로 강제 변환하는 것입니다. 주목, 문자열을 연쇄하는 연산자는 없으며, 그것들은 단지 인접하게 배치됩니다.) 강제 변환을 사용하면 프로그램은 빈 입력에 "0"을 인쇄하며, 그것없이 빈 줄이 인쇄됩니다.

Match a range of input lines

NR % 4 == 1, NR % 4 == 3 { printf "%6d  %s\n", NR, $0 }

action 문은 번호-매겨진 각 줄을 인쇄합니다. printf 함수는 표준 C printf를 에뮬레이트하고 위에서 설명한 인쇄 명령과 유사하게 작동합니다. 일치시킬 패턴은, 어쨌든, 다음과 같이 작동합니다: NR은 레코드 수, 전형적으로 입력 줄, AWK가 지금까지 읽은 것, 즉, 입력의 첫 번째 라인에 대해 1에서 시작하는 현재 줄 번호입니다. %모듈로 연산자입니다. NR % 4 == 1은 1번째, 5번째, 9번째, 등의 입력 줄에 대해 참입니다. 마찬가지로 NR % 4 == 3은 3번째, 7번째, 11번째, 등의 입력 줄에 대해 참입니다. 범위 패턴은 1행에서 첫 번째 부분이 일치할 때까지 거짓이고, 3행에서 두 번째 부분이 일치할 때까지 참을 유지합니다. 그런-다음 5행에서 첫 번째 부분이 다시 일치할 때까지 거짓을 유지합니다.

따라서, 프로그램은 1,2,3 행을 인쇄하고 4 행을 건너뛰고, 그런-다음 5,6,7을 인쇄하고, 이런 식으로 진행됩니다. 각 줄에 대해 줄 번호 (6 문자-너비 필드)를 인쇄하고 그런-다음 줄 내용을 인쇄합니다. 예를 들어, 이 입력에서 실행될 때:

Rome
Florence
Milan
Naples
Turin
Venice

The previous program prints:

     1 Rome
     2 Florence
     3 Milan
     5 Turin
     6 Venice

Printing the initial or the final part of a file

특별한 경우로, 범위 패턴의 첫 번째 부분이 지속적으로 참, 즉 1이면, 그 범위는 입력의 시작 부분에서 시작될 것입니다. 유사하게, 두 번째 부분이 지속적으로 거짓, 즉, 0이면, 그 범위는 입력이 끝날 때까지 계속될 것입니다. 예를 들어,

 /^--cut here--$/, 0

이것은 정규식 ^--cut here--$와 일치하는 첫 번째 줄, 즉 오직 "--cut here--" 구를 포함하는 줄을 끝까지 출력합니다.

Calculate word frequencies

연관 배열을 사용한 단어 빈도:

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

BEGIN 블록은 필드 구분 기호를 알파벳이 아닌 임의의 문자 시퀀스로 설정합니다. 구분 기호는 정규식일 수 있음을 주목하십시오. 그 후, 모든 각 입력 줄에서 작업을 수행하는 빈 동작에 도달합니다. 이 경우에서, 줄의 모든 각 필드에 대해, 처음 소문자로 변환된 해당 단어가 나타나는 횟수에 1을 더합니다. 마지막으로, END 블록에서, 빈도와 함께 단어를 인쇄합니다. 다음 줄은

for (i in words)

배열 words를 통과하는 루프를 만들고, i를 배열의 각 subscript로 설정합니다. 이것은 그러한 루프가 배열의 각 을 통과하는 대부분의 언어와 다릅니다. 루프는 따라서 각 단어와 그 빈도 수를 출력합니다. tolower는 책이 출판된 후 만들어진 One True awk (아래 참조)에 추가된 것입니다.

Match pattern from command line

이 프로그램은 여러 가지 방법으로 나타낼 수 있습니다. 첫 번째는 Bourne 쉘을 모든 것을 수행하는 쉘 스크립트를 만들기 위해 사용합니다. 다음은 이들 방법 중 가장 짧습니다:

#!/bin/sh

pattern="$1"
shift
awk '/'"$pattern"'/ { print FILENAME ":" $0 }' "$@"

awk 명령에서 $pattern은 쉘이 변수를 확장하지만 스페이스를 포함하는 패턴을 올바르게 처리하려면 큰 따옴표로 묶어야 하므로 작은 따옴표로 보호되지 않습니다. 보통 방법에서 패턴 자체는 전체 행 ($0)이 일치하는지 확인합니다. FILENAME은 현재 파일이름을 포함하고 있습니다. awk는 명시적 연쇄 연산자를 가지지 않습니다; 두 개의 인접한 문자열이 이들을 연쇄합니다. $0은 변경되지 않은 원래 입력 줄을 확장합니다.

이것을 쓰는 대안적인 방법이 있습니다. 이 쉘 스크립트는 awk 내에서 직접 환경에 접근합니다:

#!/bin/sh

export pattern="$1"
shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"

이것은 책이 출판된 후 One True awk의 최신 버전에 도입된 배열, ENVIRON,을 사용하는 쉘 스크립트입니다. ENVIRON,의 아래 첨자는 환경 변수의 이름입니다; 그 결과는 변수의 값입니다. 이것은 다양한 표준 라이브러리 및 POSIXgetenv 함수와 같습니다. 쉘 스크립트는 첫 번째 인수를 포함하는 환경 변수 pattern을 만들고, 그런-다음 해당 인수를 버리고 awk에게 각 파일에서 패턴을 찾도록 합니다.

~는 ~ 왼쪽 피연산자가 오른쪽 피연산자와 일치하는지 확인합니다; !~는 그것의 역입니다. 정규 표현식은 단지 문자열이고 변수에 저장될 수 있음을 주목하십시오.

다음 방법은 awk에 대한 인수를 변수에 대한 할당으로 볼 수 있는 명령줄 변수 할당을 사용합니다:

#!/bin/sh

pattern="$1"
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"

또는 -v var=value 명령줄 옵션 (예를 들어, awk -v pattern="$pattern" ...)을 사용할 수 있습니다.

마지막으로, 이것은 쉘의 도움없이 또는 awk 스크립트의 구현에 대해 너무 많이 알 필요없이 순수한 awk로 작성되었지만 (명령줄에서 변수 할당이 하는 것처럼), 약간 깁니다:

BEGIN {
    pattern = ARGV[1]
    for (i = 1; i < ARGC; i++) # remove first argument
        ARGV[i] = ARGV[i + 1]
    ARGC--
    if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book)
        ARGC = 2
        ARGV[1] = "-"
    }
}
$0 ~ pattern { print FILENAME ":" $0 }

BEGIN은 첫 번째 인수를 추출할 뿐만 아니라, BEGIN 블록이 끝난 후 파일이름으로 해석되는 것을 방지하기 위해 필요합니다. ARGC, 인수의 개수는 항상 ≥1임을 보장해야 하는데, 왜냐하면 ARGV[0]는 스크립트를 실행한 명령의 이름, 대부분의 문자열 "awk"이기 때문입니다. 역시, ARGV[ARGC]는 빈 문자열 ""임을 주목하십시오. #는 줄 끝까지 확장되는 주석을 시작합니다.

if 블록에 유의하십시오. awk는 오직 명령을 실행하기 전에 표준 입력에서 읽어야 하는지 여부를 확인합니다. 이것은 다음이

awk 'prog'

파일 이름이 없다는 사실은 오직 prog가 실행되기 전에 확인되기 때문에 작동함을 의미합니다! 만약 ARGC를 인수가 없도록 명시적으로 1로 설정하면, awk는 더 이상 입력 파일이 없다고 느끼기 때문에 단순히 종료됩니다. 그러므로, 특수 파일이름 -을 갖는 표준 입력에서 읽으라고 명시적으로 말해야 합니다.

Self-contained AWK scripts

유닉스-계열 운영 시스템에서, 자체-포함된 AWK 스크립트는 shebang 구문을 사용하여 구성될 수 있습니다.

예를 들어, 주어진 파일의 내용을 인쇄하는 스크립트는 다음 내용을 갖는 print.awk라는 파일을 생성함으로써 빌드될 수 있습니다:

#!/usr/bin/awk -f
{ print $0 }

그것은 ./print.awk <filename>로 호출될 수 있습니다.

-f는 뒤에 오는 인수가 sed에서 사용되는 것과 동일한 플래그인 AWK 프로그램을 읽을 파일임을 AWK에 알려줍니다. 그것들은 종종 한-줄짜리에 사용되기 때문에, 두 프로그램 모두 기본적으로 별도의 파일이 아닌 명령줄 인수로 제공된 프로그램을 실행합니다.

Versions and implementations

AWK는 원래 1977년에 작성되었고 버전 7 유닉스와 함께 배포되었습니다.

1985년에, 그것의 저자는 가장 중요하게 사용자-정의된 함수를 추가함으로써 어를 확장하기 시작했습니다. 그 언어는 1988년에 출판된 The The AWK Programming Language 책에 설명되어 있고, 그것의 구현은 유닉스 시스템 V 출시에서 사용할 수 있게 되었습니다. 호환되지 않는 이전 버전과의 혼동을 피하기 위해, 이 버전을 "new awk" 또는 nawk라고 부르기도 했습니다. 이 구현은 1996년 자유 소프트웨어 라이선스에 따라 출시되었고 여전히 Brian Kernighan에 의해 유지 관리되고 있습니다 (아래 외부 링크 참조하십시오).[citation needed]

UNIX/32V와 같은 유닉스의 오래된 버전은 AWK를 C로 변환하는 awkcc를 포함하고 있습니다. Kernighan은 awk를 C++로 변환하는 프로그램을 작성했습니다; 그것의 상태는 알 수 없습니다.[15]

  • BWK awk는, nawk라고 알려져 있으며, Brian Kernighan에 의한 버전을 참조합니다. 그것은 "One True AWK"라고 불리는데 왜냐하면 용어의 사용이 원래 언어를 기술한 책과 관련되고 Kernighan이 AWK의 원저자 중 한 명이라는 사실 때문입니다.[7] FreeBSD는 이 버전을 one-true-awk로 참조합니다.[16] 이 버전에는 위에서 설명된 tolowerENVIRON와 같은 책에 없는 기능도 가집니다; 자세한 내용에 대해 소스 아카이브의 FIXES 파일을 참조하십시오. 이 버전은, 예를 들어, Android, FreeBSD, NetBSD, OpenBSD, macOS, 및 illumos에서 사용됩니다. Brian Kernighan과 Arnold Robbins는 nawk에 대해 소스 저장소: github.com/onetrueawk/awk의 주요 기여자입니다.
  • gawk (GNU awk)는 또 다른 자유-소프트웨어 구현이고 국제화와 지역화 및 TCP/IP 네트워킹 구현에 상당한 진전을 이루는 유일한 구현입니다. 그것은 원래 구현이 자유롭게 제공되기 전에 작성되었습니다. 그것은 자체 디버거가 포함되어 있고, 프로파일러는 사용자에게 스크립트에 대한 측정된 성능 향상을 만들기 위해 활성화합니다. 그것은 역시 사용자에게 공유 라이브러리로 기능을 확장하는 것을 활성화합니다. 일부 리눅스 배포판은 기본 AWK 구현으로 gawk를 포함하고 있습니다.[citation needed]
    • gawk-csv. gawkCSV 확장은 입력 및 출력 CSV 형식 데이터를 처리하기 위한 기능을 제공합니다.[17]
  • mawk바이트코드 인터프리터를 기반으로 한 Mike Brennan에 의한 매우 빠른 AWK 구현입니다.
  • libmawkmawk의 포크로, 응용 프로그램에 awk 인터프리터의 여러 병렬 인스턴스를 삽입하는 것을 허용합니다.
  • awka (그것의 프론트 엔드는 mawk 프로그램 위에 작성됨)는 AWK 스크립트를 C 코드로 변환하는 또 다른 번역기입니다. 작성자의 libawka.a를 정적으로 포함하여 컴파일하면, 결과 실행 파일의 속도가 상당히 빨라지고, 작성자의 테스트에 따르면, AWK, Perl 또는 Tcl의 다른 버전과 매우 잘 비교됩니다. 작은 스크립트는 160–170 kB의 프로그램으로 바뀔 것입니다.
  • tawk (Thompson AWK)는 이전에 Thompson Automation Software에서 판매된 Solaris, DOS, OS/2, 및 Windows에 대해 AWK 컴파일러입니다 (이것은 활동이 중단되었습니다).[18]
  • Jawk는 SourceForge에서 호스팅되는 자바로 AWK를 구현하기 위한 프로젝트입니다.[19] AWK 스크립트 (예를 들어, 자바 쓰레드, 소켓, 컬렉션, 등) 내의 자바 기능에 접근을 제공하기 위해 언어 확장이 추가되었습니다.
  • xgawk는 동적으로 적재-가능한 라이브러리로 gawk를 확장하는 gawk의 포크입니다.[20] XMLgawk 확장은 공식 GNU Awk 릴리스 4.1.0에 통합되었습니다.
  • QSEAWKCC++에 대해 임베디드 응용 프로그래밍 인터페이스 (API)를 제공하는 QSE 라이브러리에 포함된 임베디드 AWK 인터프리터 구현입니다.[21]
  • libfawk는 C로 작성된 매우 작고, 함수-전용, 재진입 가능한, 임베딩 가능한 인터프리터입니다.
  • BusyBox는 Dmitry Zakharov에 의해 작성된 AWK 구현을 포함하고 있습니다. 이것은 임베디드 시스템에 적합한 매우 작은 구현입니다.
  • CLAWK는 Michael Parker에 의해 같은 저자의 정규식 라이브러리를 기반으로 Common Lisp에서 AWK 구현을 제공합니다.[22]

Books

See also

References

  1. ^ Stutz, Michael (September 19, 2006). "Get started with GAWK: AWK language fundamentals" (PDF). developerWorks. IBM. Retrieved 2015-01-29. [AWK is] often called a data-driven language -- the program statements describe the input data to match and process rather than a sequence of program steps
  2. ^ Andreas J. Pilavakis (1989). UNIX Workshop. Macmillan International Higher Education. p. 196.
  3. ^ Arnold Robbins (2015). Effective Awk Programming: Universal Text Processing and Pattern Matching (4th ed.). O'Reilly Media. p. 560.
  4. ^ a b James W. Livingston (May 2, 1988). "The Great awk Program is No Birdbrain". Digital Review. p. 91.
  5. ^ Raymond, Eric S. "Applying Minilanguages". The Art of Unix Programming. Case Study: awk. The awk action language is Turing-complete, and can read and write files. {{cite web}}: |access-date= requires |url= (help); |archive-url= requires |url= (help); Missing or empty |url= (help)
  6. ^ Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (September 1, 1978). Awk — A Pattern Scanning and Processing Language (Second Edition) (Technical report). Unix Seventh Edition Manual, Volume 2. Bell Telephone Laboratories, Inc.
  7. ^ a b Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). The AWK Programming Language. Addison-Wesley Publishing Company. ISBN 9780201079814. Retrieved 16 May 2015.
  8. ^ "UNIX Special: Profs Kernighan & Brailsford". Computerphile. September 30, 2015.
  9. ^ "The Single UNIX Specification, Version 3, Utilities Interface Table". Archived from the original on 2018-01-05. Retrieved 2005-12-18.
  10. ^ "Chapter 15. Commands and Utilities". Linux Standard Base Core Specification 4.0 (Technical report). Linux Foundation. 2008.
  11. ^ a b c Robbins, Arnold (March 2014). "The GNU Project and Me: 27 Years with GNU AWK" (PDF). skeeve.com. Retrieved October 4, 2014.
  12. ^ Dougherty, Dale; Robbins, Arnold (1997). sed & awk (2nd ed.). Sebastopol, CA: O'Reilly. p. 221. ISBN 1-565-92225-5.
  13. ^ Hamilton, Naomi (May 30, 2008). "The A-Z of Programming Languages: AWK". Computerworld. Retrieved 2008-12-12.
  14. ^ a b https://www.gnu.org/software/gawk/manual/html_node/Records.html#index-FNR-variable
  15. ^ Kernighan, Brian W. (April 24–25, 1991). An AWK to C++ Translator (PDF). Usenix C++ Conference. Washington, DC. pp. 217–228.
  16. ^ "FreeBSD's work log for importing BWK awk into FreeBSD's core". May 16, 2005. Archived from the original on September 8, 2013. Retrieved September 20, 2006.
  17. ^ gawk-csv documentation at http://gawkextlib.sourceforge.net/csv/gawk-csv.html
  18. ^ James K. Lawless (May 1, 1997). "Examining the TAWK Compiler". Dr. Dobb's Journal.
  19. ^ Jawk at SourceForge
  20. ^ xgawk Home Page
  21. ^ QSEAWK at GitHub
  22. ^ CLAWK at GitHub

Further reading

External links