awk 명령

용도

파일에서 패턴이 일치하는 행을 찾아서 그러한 행에 지정한 조치를 수행합니다.

구문

awk [ -u ] [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...

설명

awk 명령은 사용자가 제공하는 명령어 세트를 사용하여 사용자가 제공한 확장 정규식과 파일 세트를 한 번에 한 행씩 비교합니다. 그런 다음, 확장 정규식과 일치하는 모든 행에서 조치를 실행합니다.

awk 명령의 패턴 검색은 grep 명령의 패턴 검색보다 더 일반적이고, 이 경우 사용자는 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있습니다. awk 명령 프로그래밍 언어에는 컴파일이 필요하지 않으며, 사용자는 변수, 숫자 함수, 문자열 함수, 논리적 연산자를 사용할 수 있습니다.

awk 명령은 LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH, PATH 환경 변수의 영향을 받습니다.

이 문서에서는 다음 주제를 설명합니다.

awk 명령에 대한 입력

awk 명령은 두 종류의 입력, 입력 텍스트 파일과 프로그램 명령어를 사용합니다.

입력 텍스트 파일

검색과 조치는 입력 텍스트 파일에서 실행됩니다. 파일은 다음 방식으로 지정됩니다.

  • 명령행에서 File 변수를 지정합니다.
  • 특수 변수 ARGVARGC를 수정합니다.
  • File 변수가 없으면 표준 입력을 제공합니다.

File 변수에 여러 파일이 지정된 경우 파일은 지정된 순서대로 처리됩니다.

프로그램 명령어

사용자가 제공하는 명령어는 awk 명령의 조치를 제어합니다. 이 명령어는 명령행의 `Program' 변수에서 가져오거나 ProgramFile 변수와 함께 사용된 -f 플래그로 지정한 파일에서 가져옵니다. 여러 프로그램 파일이 지정되면, 파일은 지정된 순서에 따라 병합되고 그 결과로 생성되는 명령어의 순서가 사용됩니다.

awk 명령에 대한 출력

awk 명령은 입력 텍스트 파일에 있는 데이터로부터 세 가지 종류의 결과를 출력합니다.

  • 선택된 데이터는 입력 파일을 변경하지 않고 표준 출력으로 인쇄될 수 있습니다.
  • 입력 파일 중 선택된 부분을 변경할 수 있습니다.
  • 선택된 데이터는 입력 파일 컨텐츠 변경 여부와는 상관없이 변경되고 표준 출력으로 출력될 수 있습니다.

이러한 종류의 출력은 모두 같은 파일에서 수행될 수 있습니다. awk 명령이 인식하는 프로그래밍 언어를 통해 사용자는 출력 방향을 재지정할 수 있습니다.

레코드와 필드를 포함하는 파일 처리

파일은 다음과 같은 방법으로 처리됩니다.

  1. awk 명령은 명령어를 스캔하고 입력 파일을 읽기 전에 나타나도록 지정된 조치를 실행합니다.

    awk 프로그래밍 언어의 BEGIN문을 사용하여, 첫 번째 레코드를 읽기 전에 실행해야 할 명령어 세트를 지정할 수 있습니다. 이 방법은 특수 변수를 초기화하는 데 특히 유용합니다.

  2. 하나의 레코드를 입력 파일에서 읽습니다.

    레코드는 레코드 구분자로 구분된 데이터의 세트입니다. 레코드 구분자의 디폴트 값은 줄 바꾸기 문자입니다. 줄 바꾸기 문자는 파일의 각 행을 별개의 레코드로 구성합니다. 레코드 구분자는 RS 특수 변수를 설정하여 변경할 수 있습니다.

  3. 레코드는 awk 명령의 명령어로 지정한 각 패턴과 비교합니다.

    명령의 명령어는 레코드 내의 특정 필드을 비교하도록 지정할 수 있습니다. 기본적으로, 필드는 공백 문자(공백 또는 탭)에 의해 구분됩니다. 각 필드는 필드 변수에 의해 참조됩니다. 레코드의 첫 번째 필드에는 $1 변수가 지정되고, 두 번째 필드에는 $2 변수가 지정되고, 나머지 필드도 마찬가지입니다. 전체 레코드가 $0 변수에 지정됩니다. 필드 구분자는 명령행에서 -F 플래그를 사용하거나 FS 특수 변수를 설정하여 변경할 수 있습니다. FS 특수 변수는 공백, 단일 문자 또는 확장 정규식의 값으로 설정할 수 있습니다.

  4. 레코드가 패턴과 일치하면, 해당 패턴과 연관된 조치를 레코드에서 실행합니다.
  5. 레코드를 각 패턴과 비교하고, 지정된 모든 조치를 수행한 후 입력으로부터 다음 레코드를 읽습니다. 입력 파일에서 모든 레코드를 읽을 때까지 프로세스를 반복합니다.
  6. 여러 입력 파일이 지정된 경우 다음 파일을 열고 모든 입력 파일을 읽을 때까지 프로세스를 반복합니다.
  7. 마지막 파일에서 마지막 레코드를 읽은 후 awk 명령은 입력 처리 후 나타나도록 지정된 모든 명령어를 실행합니다.

    awk 프로그래밍 언어의 END문을 사용하여 마지막 레코드를 읽은 후 수행할 조치를 지정할 수 있습니다. 특히 awk 명령으로 수행하는 작업에 대한 메시지를 전송할 때 유용합니다.

awk 명령 프로그래밍 언어

awk 명령 프로그래밍 언어는 다음과 같은 양식의 명령문으로 구성됩니다.

Pattern { Action }

레코드가 지정된 패턴과 일치하거나 패턴과 일치하는 필드를 포함하면 연관된 조치가 수행됩니다. 조치가 없는 패턴을 지정할 수도 있습니다. 이 경우 패턴을 포함하고 있는 전체 행이 표준 출력으로 작성됩니다. 패턴이 없이 지정된 조치는 모든 입력 레코드에서 실행됩니다.

패턴

awk 명령 언어 구문에서 사용되는 패턴으로는 네 가지 유형이 있습니다.

정규식

awk 명령에서 사용하는 확장 정규식은 grep 또는 egrep 명령에서 사용하는 정규식과 비슷합니다. 가장 간단한 양식의 확장 정규식은 슬래시 기호로 묶은 문자열입니다. 예를 들어, testfile이라는 이름의 파일에 다음 컨텐츠가 있다고 가정합니다.

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

다음 명령행을 입력합니다.

awk '/smi/' testfile

그러면 문자열 smi의 발생을 포함하는 모든 레코드의 표준 출력으로 인쇄합니다. 이 예제에서, awk 명령에 대한 '/smi/' 프로그램은 조치가 없는 패턴입니다. 결과는 다음과 같습니다.

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

다음의 특수 문자는 확장 정규식을 구성하는 데 사용됩니다.

문자 함수
+ 문자열 내에서 +(더하기 기호)가 앞에 나오는 확장 정규식 또는 하나 이상의 문자 발생이 포함되면 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.
awk '/smith+ern/' testfile

이 명령행은 smit 문자와 하나 이상의 h 문자가 나오고 ern 문자로 끝나는 문자열을 포함하는 레코드를 표준 출력에 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smithern, harry
smithhern, anne
? 문자열 내에서 ?(물음표)가 앞에 나오는 확장 정규식 또는 0개 이상의 문자 발생이 포함되면 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.

awk '/smith?/' testfile

이 명령행은 smit 문자와 0개 이상의 h 문자 인스턴스를 포함하는 모든 레코드를 표준 출력에 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smith, alan
smithern, harry
smithhern, anne
smitters, alexis
| |(세로행)로 구분된 두 문자열 중 하나가 문자열에 포함되어 있으면, 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.
awk '/allen 
| 
alan /' testfile

이 명령행은 문자열 allen 또는 alan을 포함하고 있는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smiley, allen
smith, alan
( ) 확장 정규식 안에서 문자열을 그룹화합니다. 예를 들어, 다음과 같습니다.
awk '/a(ll)?(nn)?e/' testfile

이 명령행은 문자열 ae, alle, anne 또는 allnne을 포함하는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smiley, allen
smithhern, anne
{m} 패턴에 나타나는 것과 똑같이 m이 문자열 내에 포함되면 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.

awk '/l{2}/' testfile

이 명령행은 표준 출력으로 인쇄합니다.

smiley, allen
{m,} 패턴에서 m의 최소 발생이 문자열 내에 포함되면 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.

awk '/t{2,}/' testfile

이 명령행은 다음과 같이 표준 출력으로 인쇄합니다.

smitters, alexis
{m, n} mn을 포함하여 이 문자 사이에 있는 패턴 발생이 문자열 내에 포함되면(여기서 m <= n) 문자열이 일치하도록 지정합니다. 예를 들어, 다음과 같습니다.
awk '/er{1, 2}/' testfile

이 명령행은 다음과 같이 표준 출력으로 인쇄합니다.

smithern, harry
smithern, anne
smitters, alexis
[String] 정규식이 대괄호 내 String 변수로 지정된 문자와 일치함을 의미합니다. 예를 들어, 다음과 같습니다.
awk '/sm[a-h]/' testfile

이 명령행은 sm 문자와 알파벳순(a - h)의 문자를 포함하는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
[^ String] 지정된 문자열의 시작 위치와 [](대괄호) 내 캐럿 문자는 정규식이 대괄호로 묶은 문자와 일치하지 않음을 의미합니다. 예를 들어, 다음과 같습니다.
awk '/sm[^a-h]/' testfile

이 명령행은 다음과 같이 표준 출력으로 인쇄합니다.


smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
~,!~ 지정된 변수가 정규식과 일치(~) 또는 불일치(~, !)하는 조건문을 나타냅니다. 예를 들어, 다음과 같습니다.
awk '$1 ~ /n/' testfile

이 명령행은 첫 번째 필드가 문자 n을 포함하고 있는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제에서 출력은 다음과 같습니다.

smithern, harry
smithhern, anne
^ 필드나 레코드의 시작을 나타냅니다. 예를 들어, 다음과 같습니다.
awk '$2 ~ /^h/' testfile

이 명령행은 문자 h를 두 번째 필드의 첫 문자로 포함하는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smithern, harry
$ 필드나 레코드의 끝을 나타냅니다. 예를 들어, 다음과 같습니다.
awk '$2 ~ /y$/' testfile

이 명령행은 문자 y를 두 번째 필드의 마지막 문자로 포함하는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
smithern, harry
. (마침표) 공백 끝에 있는 터미널 줄 바꾸기 문자를 제외한 모든 단일 문자를 나타냅니다. 예를 들어, 다음과 같습니다.
awk '/a..e/' testfile

이 명령행은 두 개의 문자로 구분되는 a와 e 문자가 있는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.


smawley, andy
smiley, allen
smithhern, anne
*(별표) 0개 이상의 문자를 나타냅니다. 예를 들어, 다음과 같습니다.
awk '/a.*e/' testfile

이 명령행은 0개 이상의 문자로 구분되는 a와 e 문자가 있는 모든 레코드를 표준 출력으로 인쇄합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\(백슬래시) 이스케이프 문자입니다. 이스케이프 문자가 확장 정규식 내에서 특별한 의미를 가지고 있는 문자 앞에 있으면, 문자로부터 해당 의미를 제거합니다. 예를 들어, 다음과 같습니다.
/a\/\//

이 명령행은 a // 패턴과 일치합니다. 왜냐하면, 백슬래시는 슬래시가 정규식의 분리 문자라는 통상적인 의미를 부정하기 때문입니다. 백슬래시 그 자체를 문자로 지정하려면, 이중 백슬래시를 사용합니다. 백슬래시와 해당 사용법에 대한 자세한 정보는 이스케이프 시퀀스에 관한 다음 항목을 참조하십시오.

인식되는 이스케이프 시퀀스

awk 명령은 C 언어 규칙에 사용되는 대부분의 이스케이프 시퀀스와 awk 명령에 의해 특수 문자로 사용되는 여러 이스케이프 시퀀스를 인식합니다. 이스케이프 시퀀스는 다음과 같습니다.

이스케이프 시퀀스 표시되는 문자
\" "(이중 인용 부호) 표시
\/ /(슬래시) 문자
\ddd 1자리, 2자리 또는 3자리 8진 정수로 인코딩을 표시하는 문자입니다. 여기서, d는 8진 숫자를 나타냅니다.
\\ \(백슬래시) 문자
\a 경고 문자
\b 백스페이스 문자
\f 용지 넘김 문자
\n 줄 바꾸기 문자(다음 참고 참조)
\r 캐리지 리턴(CR) 문자
\t 탭 문자
\v 세로 탭.

참고: gsub, match, split, sub 내장 함수를 제외하고, 확장 정규식 일치는 입력 레코드에 기반합니다. 레코드 구분자 문자(기본적으로, 줄 바꾸기 문자)는 표현식에 임베드될 수 없으며, 어떠한 표현식도 레코드 구분자 문자와 일치하지 않습니다. 레코드 구분자가 줄 바꾸기 문자가 아닌 경우, 줄 바꾸기 문자는 일치될 수 있습니다. 지정된 네 개의 내장 함수에서 일치는 텍스트 문자열에 기반하며, 패턴이 적절한 문자와 일치하도록 레코드 구분자를 포함한 임의의 문자를 패턴에 임베드할 수 있습니다. 그러나, awk 명령이 있는 모든 정규식 일치에서, 패턴에서의 하나 이상의 널(NULL) 문자의 사용은 정의되지 않은 결과를 생성합니다.

관계식

관계 연산자 <(보다 작음), >(보다 큼), <=(작거나 같음), >=(크거나 같음), = =(같음) 그리고 ! =(같지 않음)은 패턴을 만드는 데 사용할 수 있습니다. 예를 들어, 다음과 같습니다.


$1 < $4

이 패턴은 첫 번째 필드가 네 번째 필드보다 작은 레코드와 일치합니다. 관계 연산자는 문자열 값과도 사용할 수 있습니다. 예:


$1 =! "q"

이 패턴은 첫 번째 필드가 q가 아닌 모든 레코드와 일치합니다. 배열 값에서 문자열 값을 일치시킬 수도 있습니다. 예:


$1 >= "d"

이 패턴은 첫 번째 필드가 a, b, c 또는 d인 문자로 시작되는 모든 레코드와 일치합니다. 다른 정보를 제공하지 않은 경우 필드 변수는 문자열 값으로 비교됩니다.

패턴의 조합

세 가지 옵션을 사용해 패턴을 결합할 수 있습니다.

  • 범위는 ,(쉼표)로 구분된 두 패턴으로 지정됩니다. 첫 번째 패턴과 일치하는 레코드로 시작하여 두 번째 패턴과 일치하는 레코드를 포함하여 계속되는 모든 레코드에서 조치가 수행됩니다. 예:
    /begin/,/end/
    이 패턴은 문자열 begin을 포함하는 레코드, 이 문자열과 문자열 end를 포함하는 레코드 사이의 모든 레코드(문자열 end를 포함하는 레코드 포함)와 일치합니다.
  • 괄호( )는 패턴을 함께 그룹화합니다.
  • 부울 연산자 ||(또는), &&(및), ! (부정)는 true로 평가되는 경우 일치하는 표현식에 패턴을 결합합니다. true가 아니면 이들은 일치하지 않습니다. 예를 들어, 다음과 같습니다.
    
    $1 == "al" && $2 == "123"
    이 패턴은 첫 번째 필드가 al이고 두 번째 필드가 123인 레코드와 일치합니다.

BEGIN 및 END 패턴

BEGIN 패턴으로 지정된 조치는 모든 입력을 읽기 전에 수행됩니다. END 패턴으로 지정된 조치는 모든 입력을 읽은 후에 수행됩니다. 여러 개의 BEGINEND 패턴이 허용되고, 지정된 순서대로 처리됩니다. 프로그램 명령문에서 END 패턴이 BEGIN 패턴 앞에 올 수 있습니다. 프로그램이 BEGIN문만으로 구성된 경우, 조치가 수행되며 어떠한 입력도 읽지 않습니다. 프로그램이 END문만으로 구성된 경우, 모든 입력은 조치를 취하기 전에 읽습니다.

조치

여러 유형의 조치문이 있습니다.

조치문

조치문은 { }(중괄호)로 묶습니다. 패턴 없이 명령문이 지정되면, 조치는 모든 레코드에서 실행됩니다. 중괄호 안에 다중 조치를 지정할 수 있습니다. 그러나 각 조치는 줄 바꾸기 문자 또는 ;(세미콜론)으로 구분되어야 하고, 명령문은 나타나는 순서대로 처리됩니다. 조치문은 다음을 포함하고 있습니다.

산술문
산술 연산자, +(더하기 부호), -(빼기 부호), /(나눗셈), ^(지수화), *(곱셈), %(모듈러스)는 다음 양식으로 사용됩니다.
Expression Operator Expression

따라서, 명령문은 다음과 같습니다.


$2 = $1 ^ 3

이 명령문은 첫 번째 필드의 세제곱 값을 두 번째 필드에 지정합니다.

단항 명령문
단항 -(빼기) 및 단항 +(더하기)는 C 프로그래밍 언어로 작동합니다.
+Expression or -Expression
증분 및 감소 명령문
사전 증분 및 사전 감소 명령문은 C 프로그래밍 언어에서와 같이 작동합니다.
++Variable or --Variable

사후 증분 및 사후 감소 명령문은 C 프로그래밍 언어에서와 같이 작동합니다.

Variable++ or Variable--
지정문
지정 연산자, +=(더하기), -=(빼기), /=(나누기) 및 *=(곱하기)는 다음 양식으로 C 프로그래밍 언어에서와 같이 작동합니다.
Variable += Expression

Variable -= Expression

Variable /= Expression

Variable *= Expression

예를 들어, 다음과 같습니다.

$1 *= $2

이 명령문은 필드 변수 $1을 필드 변수 $2에 곱한 후 새 값을 $1에 지정합니다.

지정 연산자, ^=(지수화) 및 %= (모듈러스)는 다음 양식을 사용합니다.

Variable1^=Expression1

Variable2%=Expression2

이 명령문은 다음과 같은 C 프로그램밍 언어와 동일합니다.

Variable1=pow(Variable1, Expression1)

Variable2=fmod(Variable2, Expression2)

여기서, powpow 서브루틴이고, fmodfmod 서브루틴입니다.

문자열 병합 명령문
문자열 값을 나란히 연결하여 병합할 수 있습니다. 예:
$3 = $1 $2

이 명령문은 필드 변수 $1$2의 문자열 병합을 필드 변수 $3에 지정합니다.

내장 함수

awk 명령 언어는 산술 함수, 문자열 함수, 일반 함수를 사용합니다. 파일을 작성하고 이 파일을 나중에 같은 프로그램에서 읽으려면 close 서브루틴문이 있어야 합니다.

산술 함수

다음 산술 함수는 동일한 이름의 C 언어 서브루틴과 같은 기능을 수행합니다.

항목 설명
atan2( y, x ) y/x의 아크탄젠트를 리턴합니다.
cos( x ) x의 코사인을 리턴합니다. x는 라디안 단위입니다.
sin( x ) x의 사인을 리턴합니다. x는 라디안 단위입니다.
exp( x ) x의 지수 함수를 리턴합니다.
log( x ) x의 자연 대수를 리턴합니다.
sqrt( x ) x의 제곱근을 리턴합니다.
int( x ) x를 정수로 자른 값을 리턴합니다.
rand( ) 랜덤 숫자 n을 리턴합니다. 이때, 0 <= n < 1.
srand( [Expr] ) rand 함수의 시드(seed) 값을 Expr 매개변수의 값으로 설정하거나, Expr 매개변수를 생략할 경우 하루 중 시간을 사용합니다. 이전 시드(seed) 값이 리턴됩니다.

문자열 함수

문자열 함수는 다음과 같습니다.

항목 설명
gsub( Ere, Repl, [ In ] ) 나타나는 모든 정규식이 대체된다는 점을 제외하고, sub 함수와 똑같은 기능을 수행합니다.
sub( Ere, Repl, [ In ] ) In 매개변수로 지정된 문자열에서 Ere 매개변수에 의해 지정된 확장 정규식 중 첫 번째 정규식을 Repl 매개변수에 의해 지정된 문자열로 대체합니다. sub 함수는 대체 횟수를 리턴합니다. Repl 매개변수로 지정하는 문자열에 표시되는 &(앰퍼샌드)는 Ere 매개변수가 지정한 확장 정규식과 일치하는 In 매개변수의 문자열로 대체됩니다. In 매개변수를 지정하지 않으면, 디폴트 값은 전체 레코드($0 레코드 변수)입니다.
index( String1, String2 ) String1 매개변수로 지정된 문자열 내에서 String2 매개변수로 지정된 문자열이 나타나는 위치를 1부터 번호를 매겨 리턴합니다. String2 매개변수가 String1 매개변수에 나타나지 않으면 0(영)이 리턴됩니다.
length [(String)] String 매개변수로 지정된 문자열의 길이를 문자 수로 리턴합니다. String 매개변수를 지정하지 않으면, 전체 레코드의 길이($0 레코드 변수)가 리턴됩니다.
blength [(String)] String 매개변수로 지정된 문자열의 길이를 바이트 단위로 리턴합니다. String 매개변수를 지정하지 않으면, 전체 레코드의 길이($0 레코드 변수)가 리턴됩니다.
substr( String, M, [ N ] ) N 매개변수로 지정된 문자 수가 있는 부속 문자열을 리턴합니다. 부속 문자열은 String 매개변수로 지정한 문자열 내에서, M 매개변수가 지정한 위치에 있는 문자로부터 시작하여 가져옵니다. M 매개변수는 String 매개변수에서 숫자 1의 첫 번째 문자로 지정됩니다. N 매개변수가 지정되지 않으면 부속 문자열의 길이는 M 매개변수로 지정한 위치부터 String 매개변수 끝까지로 계산됩니다.
match( String, Ere ) String 매개변수로 지정된 문자열 내에서 Ere 매개변수로 지정된 확장 정규식이 나타나는 위치를 1부터 번호를 매겨 문자로 리턴합니다. 그렇지 않고 Ere 매개변수가 없으면 0(영)을 리턴합니다. RSTART 특수 변수는 리턴 값으로 설정됩니다. RLENGTH 특수 변수는 일치하는 문자열 길이 또는 일치 항목이 없으면 -1(음수)로 설정됩니다.
split( String, A, [Ere] ) String 매개변수로 지정된 문자열을 배열 요소 A[1], A[2], . . ., A[n]으로 분할하고, n 변수의 값을 리턴합니다. Ere 매개변수로 지정된 확장 정규식으로 분리되고, Ere 매개변수가 제공되지 않을 경우에는 현재 필드 구분자(FS 특수 변수)로 분리됩니다. A 배열에 있는 요소는 문맥상 한 특별 요소가 숫자 값도 가져야만 하는 것이 아니라면, 문자열 값으로 작성됩니다.
tolower( String ) String 매개변수로 지정된 문자열을 리턴합니다. 이때, 문자열의 각 대문자는 소문자로 변경됩니다. 대문자와 소문자의 맵핑은 현재 로케일의 LC_CTYPE 범주에 의해 정의됩니다.
toupper( String ) String 매개변수로 지정된 문자열을 리턴합니다. 이때, 문자열에서 각 소문자는 대문자로 변경됩니다. 대문자와 소문자의 맵핑은 현재 로케일의 LC_CTYPE 범주에 의해 정의됩니다.
sprintf(Format, Expr, Expr, . . . ) Format 매개변수로 지정된 printf 서브루틴 형식 문자열에 따라 Expr 매개변수로 지정된 표현식을 형식화하고 결과로 생성된 문자열을 리턴합니다.

일반 함수

일반 함수는 다음과 같습니다.

항목 설명
close( Expression ) print 또는 printf문으로 열린 파일 또는 파이프를 닫거나 동일한 문자열 값을 사용하는 Expression 매개변수를 포함하는 getline 함수에 대한 호출을 닫습니다. 파일이나 파이프를 성공적으로 닫으면, 0이 리턴되고, 그렇지 않으면 0이 아닌 값이 리턴됩니다. 파일을 작성하고 이 파일을 나중에 같은 프로그램에서 읽으려면 close문이 있어야 합니다.
system(Command ) Command 매개변수로 지정된 명령을 실행하고 해당 종료 상태를 리턴합니다. 이 명령문은 system 서브루틴과 동등합니다.
Expression | getline [ Variable ] Expression 매개변수로 지정된 명령의 출력에서 생성(piped)된 스트림으로부터 입력 레코드를 읽고 Variable 매개변수로 지정된 변수에 레코드 값을 지정합니다. Expression 매개변수의 값을 명령 이름으로 포함하는 스트림이 현재 열려 있지 않으면 스트림이 작성됩니다. 작성된 스트림은 값이 r로 설정된 Mode 매개변수와 Expression 매개변수 값을 사용하는 Command 매개변수를 포함하는 popen 서브루틴에 대한 호출로 작성된 항목과 동등합니다. 스트림이 열려 있고 Expression 매개변수의 값이 동일한 문자열로 평가되는 한, getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. Variable 매개변수를 지정하지 않으면, $0 레코드 변수와 NF 특수 변수는 스트림으로부터 읽은 레코드로 설정됩니다.
getline [ Variable ] < Expression Expression 매개변수에서 이름 지정된 파일로부터 입력의 다음 레코드를 읽고 Variable 매개변수에서 지정한 변수를 레코드 값으로 설정합니다. 스트림이 열려 있고 Expression 매개변수의 값이 동일한 문자열로 평가되는 한, getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. Variable 매개변수를 지정하지 않으면, $0 레코드 변수와 NF 특수 변수는 스트림으로부터 읽은 레코드로 설정됩니다.
getline [ Variable ] Variable 매개변수로 지정된 변수를 현재 입력 파일의 다음 입력 레코드로 설정합니다. Variable 매개변수를 지정하지 않은 경우 $0 레코드 변수는 레코드 값으로 설정되고, NF, NR, FNR 특수 변수도 설정됩니다.

참고: 모든 양식의 getline 함수는 성공적인 입력에 대해서는 1, 파일 끝에 대해서는 0, 오류에 대해서는 -1을 리턴합니다.

사용자 정의 함수

사용자 정의 함수는 다음 양식으로 선언됩니다.

function Name (Parameter, Parameter,...)  { Statements }

함수는 awk 명령 프로그램의 아무 위치에서 참조 가능하고, 해당 사용법은 해당 정의 앞에 나올 수 있습니다. 함수의 유효범위는 글로벌입니다.

함수의 매개변수는 스칼라나 배열일 수 있습니다. 매개변수의 이름은 함수에 대해 로컬로 유효합니다. 다른 모든 변수 이름은 글로벌입니다. 다른 엔티니에 같은 이름을 사용해서는 안 됩니다. 예를 들어, 매개변수의 이름을 함수 이름이나 특수 변수로 중복 사용하면 안 됩니다. 글로벌 유효범위의 변수는 함수의 이름을 공유해서는 안 됩니다. 스칼라와 배열은 동일 유효범위에서 이름이 같아서는 안 됩니다.

함수 정의의 매개변수 수는 함수가 호출될 때 사용되는 매개변수의 수와 일치할 필요는 없습니다. 초과(excess) 형식 매개변수는 로컬 변수로 사용할 수 있습니다. 추가적인 스칼라 매개변수는 빈 문자열 및 숫자 값 0(영)과 동등한 문자열 값으로 초기화되며, 추가적인 배열 매개변수는 빈 배열로 초기화됩니다.

함수를 호출할 때, 함수 이름과 시작하는 괄호 사이에 공백 문자가 없어야 합니다. 함수 호출은 중첩될 수 있고 순환적일 수 있습니다. 중첩 또는 순환 함수 호출에서 리턴할 때, 참조에 의해 전달되는 배열 매개변수를 제외한 모든 호출 함수의 매개변수 값은 변경되지 않습니다. return문은 값을 리턴하는 데 사용할 수 있습니다.

함수 정의 내에서 줄 바꾸기 문자는 시작하는 중괄호 { 앞과 닫는 중괄호 } 뒤에서 선택적으로 배치할 수 있습니다.

다음은 함수 정의의 예제입니다.


function average ( g,n) 
  {
        for (i in g)
           sum=sum+g[i]
        avg=sum/n
        return avg
  } 

average 함수에서는 배열, g 및 변수, n(배열의 요소 수 포함)이 전달됩니다. 그러면 함수는 평균을 구하고 해당 값을 리턴합니다.

조건문

awk 명령 프로그래밍 언어에서 대부분의 조건문은 C 프로그래밍 언어의 조건문과 구문 및 기능이 동일합니다. 모든 조건문은 명령문을 그룹화하기 위해 { }(중괄호)의 사용을 허용합니다. 조건문의 표현식 부분과 명령문 부분 사이에 선택적으로 줄 바꾸기를 사용할 수 있으며, 줄 바꾸기 또는 ;(세미콜론)을 사용하여 { }(중괄호) 안에서 다중 명령문을 구분합니다. C 언어에는 다음과 같은 여섯 가지 조건문이 있습니다.

항목 설명
if 다음과 같은 구문을 필요로 합니다.

if ( Expression ) { Statement } [ else Action ]

while 다음과 같은 구문을 필요로 합니다.

while ( Expression ) { Statement }

for 다음과 같은 구문을 필요로 합니다.

for ( Expression ; Expression ; Expression ) { Statement }

break break문을 while 또는 for문에서 사용하는 경우 프로그램 루프가 종료됩니다.
continue continue문을 while 또는 for문에서 사용하는 경우 프로그램 루프가 다음 반복으로 이동합니다.

다음 C 언어 규칙을 준수하지 않는 awk 명령 프로그래밍 언어의 5개 조건문은 다음과 같습니다.

항목 설명
for...in 다음과 같은 구문을 필요로 합니다.

for ( Variable in Array ) { Statement }

for...in문은 Variable 매개변수를 Array 변수의 각 색인 값으로 설정하고(특정 순서 없이 한 번에 하나의 색인), 각 반복에서 Statement 매개변수로 지정된 조치를 수행합니다. for...in문에 대한 예제는 delete문을 참조하십시오.

if...in 다음과 같은 구문을 필요로 합니다.

if ( Variable in Array ) { Statement }

if...in문은 Array 요소의 존재 여부를 검색합니다. 이 명령문은 Array 요소를 찾으면 수행됩니다.

delete 다음과 같은 구문을 필요로 합니다.

delete Array [ Expression ]

delete문은 Array 매개변수에 의해 지정된 배열 요소와 Expression 매개변수가 지정한 색인을 모두 삭제합니다. 예를 들어, 다음과 같습니다.


for (i in g)
   delete g[i];

이 명령문은 g[] 배열의 모든 요소를 삭제합니다.

exit 다음과 같은 구문을 필요로 합니다.

exit [ Expression ]

exit문은 나타나는 순서대로 모든 END 조치를 먼저 호출한 후, Expression 매개변수로 지정한 종료 상태의 awk 명령을 종료합니다. exit문이 END 조치에서 나타나면 후속 END 조치는 호출되지 않습니다.

# 다음과 같은 구문을 필요로 합니다.

# Comment

# 명령문은 주석을 배치합니다. 주석은 항상 줄 바꾸기로 끝나야 하지만, 행 중 어디에서든지 시작할 수 있습니다.

next 현재 입력 레코드의 처리를 중지하고 다음 입력 레코드로 넘어갑니다.

출력문

awk 명령 프로그래밍 언어의 두 출력문은 다음과 같습니다.

항목 설명
print 다음과 같은 구문을 필요로 합니다.

print [ ExpressionList ] [ Redirection ] [ Expression ]

print문은 ExpressionList 매개변수로 지정된 각 표현식 값을 표준 출력으로 작성합니다. 각 표현식은 OFS 특수 변수의 현재 값으로 구분되며, 각 레코드는 ORS 특수 변수의 현재 값으로 종료됩니다.

Redirection 매개변수를 사용해 출력 방향을 재지정할 수 있는데, 이때 >(보다 큼), >>(보다 큼 기호 2개), 그리고 |(파이프)를 사용하여 세 가지로 출력 방향을 재지정할 수 있습니다. Redirection 매개변수는 출력을 재지정하는 방법을 지정하고, Expression 매개변수는 파일에 대한 경로 이름(Redirection 매개변수가 > 또는 >>인 경우) 또는 명령 이름(Redirection 매개변수가 |인 경우)입니다.

printf 다음과 같은 구문을 필요로 합니다.

printf Format [ , ExpressionList ] [ Redirection ] [ Expression ]

printf문은 ExpressionList 매개변수로 지정한 표현식을 Format 매개변수로 지정한 형식으로 표준 출력에 작성합니다. printf문 함수는 c 변환 스펙(%c)을 제외하고 printf 명령과 정확하게 같습니다. RedirectionExpression 매개변수는 print문에서와 같은 기능을 수행합니다.

c 변환 스펙의 경우: 인수에 숫자 값이 있으면 인코딩이 해당 값인 문자가 출력됩니다. 값이 0이거나 문자 세트에 있는 문자의 인코딩이 아니면, 동작은 정의되지 않습니다. 인수에 숫자 값이 없으면 문자열 값의 첫 번째 문자가 출력됩니다. 문자열이 문자를 포함하지 않으면 동작은 정의되지 않습니다.

참고: Expression 매개변수가 Redirection 매개변수에 대한 경로 이름을 지정하는 경우 Expression 매개변수는 이를 문자열로 처리하도록 이중 인용 부호로 묶어야 합니다.

변수

변수는 스칼라, 필드 변수, 배열 또는 특수 변수일 수 있습니다. 변수의 이름은 숫자로 시작해서는 안 됩니다.

변수는 참조를 통해서만 사용할 수 있습니다. 함수 매개변수인 경우를 제외하면, 변수는 명시적으로 선언되지 않습니다. 초기화되지 않은 스칼라 변수와 배열 요소는 숫자 값 0(영)과 문자열 값인 널(null) 문자열(" ") 모두를 사용합니다.

변수는 문맥에 따라 숫자 값이나 문자열 값을 사용합니다. 각 변수는 숫자 값, 문자열 값 또는 둘 다를 사용할 수 있습니다. 예를 들면 다음과 같습니다.


x = "4" + "8"

이 표현식은 12의 값을 x 변수에 지정합니다. 문자열 상수인 경우 표현식은 " "(이중 인용 부호) 표시로 묶어야 합니다.

숫자와 문자열 사이에 명시적인 변환은 없습니다. 표현식을 숫자로 강제 처리하려면, 0을 추가하십시오. 표현식을 문자열로 강제 처리하려면, 널(null) 문자열(" ")을 추가하십시오.

필드 변수

필드 변수는 $(달러 기호) 및 숫자 또는 숫자 표현식으로 지정됩니다. 레코드의 첫 번째 필드에는 $1 변수가 할당되고, 두 번째 필드에는 $2 변수가 할당되는 식입니다. $0 필드 변수는 전체 레코드에 지정됩니다. 새 필드 변수는 값을 지정하여 작성될 수 있습니다. 존재하지 않는 필드에 값을 지정하면(즉, $NF 필드 변수의 현재 값보다 큰 필드) 중간에 필드가 강제로 작성되고(널(null) 문자열로 설정됨), NF 특수 변수 값을 늘리며, $0 레코드 변수 값을 강제로 재계산합니다. 새 필드는 현재 필드 구분자(FS 특수 변수 값임)로 구분됩니다. 공백 및 탭은 디폴트 필드 구분자입니다. 필드 구분자를 변경하려면, -F 플래그를 사용하거나, FS 특수 변수를 awk 명령 프로그램의 다른 값으로 지정하십시오.

배열

배열은 처음에는 비어 있고, 해당 크기는 동적으로 변합니다. 배열은 [ ](대괄호) 안에 첨자가 있는 변수로 나타냅니다. 첨자 또는 요소 ID는 연관 배열 기능 유형을 제공하는 여러 문자열일 수 있습니다. 예를 들어, 다음과 같습니다.

/red/  { x["red"]++ }
/green/ { y["green"]++ }

이 프로그램은 red 카운터 및 green 카운터 모두에 대해 개수를 증분시킵니다.

몇몇 프로그래밍 언어의 다차원 배열처럼 배열은 둘 이상의 첨자로 색인화될 수 있습니다. awk 명령에 대한 프로그래밍 배열은 실제로는 1차원이기 때문에, 쉼표에 의해 구분된 첨자는 별개 표현식의 문자열 값을 병합하여 단일 문자열로 변환할 수 있습니다. 이때 각 표현식은 SUBSEP 환경 변수의 값으로 구분됩니다. 따라서, 다음의 두 색인 연산은 동등합니다.


x[expr1, expr2,...exprn]

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

in 연산자를 사용할 때, 다차원 Index 값은 괄호로 묶어야 합니다. in 연산자의 경우를 제외하면, 존재하지 않은 배열 요소를 참조하면 자동으로 해당 요소가 작성됩니다.

특수 변수

다음 변수는 awk 명령에 대해 특별한 의미를 지니고 있습니다.

항목 설명
ARGC ARGV 배열에 있는 요소의 수입니다. 이 값은 변경할 수 있습니다.
ARGV 각 멤버가 File 변수 또는 Assignment 변수 중 하나를 포함하는 배열로, 명령행의 순서를 사용하고, 0(영)부터 ARGC -1까지 번호가 지정됩니다. 각 입력 파일이 끝나면 다음과 같은 경우가 아닌 한 ARGV 배열의 다음 멤버가 다음 입력 파일의 이름을 제공합니다.
  • 다음 멤버가 Assignment문입니다. 이 경우, 지정이 평가됩니다.
  • 다음 멤버가 널(null) 값을 가지고 있습니다. 이 경우, 멤버는 생략됩니다. 입력 파일을 포함하고 있는 ARGV 배열의 멤버를 널(null) 값에 설정하여 프로그램은 선택된 입력 파일을 생략할 수 있습니다.
  • 다음 멤버가 ARGV [ARGC -1]의 현재 값입니다. 이때 awk 명령은 입력 파일의 끝으로 이를 해석합니다.
CONVFMT 숫자를 문자열로 변환하기 위한 printf 형식(OFMT 특수 변수가 사용되는 출력문의 경우 제외)입니다. 디폴트는 "% .6g"입니다.
ENVIRON awk 명령이 작동하는 환경을 나타내는 배열입니다. 배열의 각 요소는 다음과 같은 양식으로 되어 있습니다.

ENVIRON [ "Environment VariableName" ] = EnvironmentVariableValue

awk 명령이 실행되기 시작할 때, 값이 설정됩니다. 해당 환경은 ENVIRON 특별 변수의 변경 여부에 상관없이 실행이 끝날 때까지 사용됩니다.

FILENAME 현재 입력 파일의 경로 이름입니다. BEGIN 조치 실행 중 FILENAME의 값은 정의되지 않습니다. END 조치의 실행 중, 값은 처리된 최종 입력 파일의 이름입니다.
FNR 현재 파일에서 현재 입력 레코드의 번호입니다.
FS 입력 필드 구분자입니다. 디풀트 값은 공백입니다. 입력 필드 구분자가 공백이면, 로케일에 정의된 공백의 수는 제한이 없습니다. FS 특별 변수는 두 가지 추가 값을 사용할 수 있습니다.
  • FS를 단일 문자로 설정하면 필드는 해당 문자를 한 번 표시하여 구분됩니다.
  • FS확장 정규식으로 설정된 경우 확장 정규식과 일치하는 시퀀스가 나타날 때마다 필드를 구분합니다.
NF 현재 레코드의 필드 개수로 상한값은 99입니다. BEGIN 조치 내에서, NF 특별 변수는 Variable 매개변수가 없는 getline 함수가 이전에 사용되지 않았으면 정의되지 않습니다. END 조치 내에서 NF 특수 변수는 END 조치를 입력하기 전에 Variable 매개변수가 없으며 방향이 재지정된 후속 getline 함수가 실행되지 않으면 마지막 읽은 레코드에 있던 값을 보유합니다.
NR 현재 입력 레코드의 번호입니다. BEGIN 조치 내에서 NR 특수 변수 값은 0(영)입니다. END 조치 내에서, 값은 처리된 최종 레코드의 번호입니다.
OFMT 출력문에서 숫자를 문자열로 변환하기 위한 printf 형식입니다. 디폴트는 "% .6g"입니다.
OFS 출력 필드 구분자(디폴트는 공백)입니다.
ORS 출력 레코드 구분자(디폴트는 줄 바꾸기 문자)입니다.
RLENGTH match 함수에 의해 일치되는 문자열의 길이입니다.
RS 입력 레코드 구분자(디폴트는 줄 바꾸기 문자)입니다. RS 특수 변수가 널(null)이면 레코드는 하나 이상의 빈 줄 시퀀스로 구분됩니다. 선행 또는 후행 빈 줄은 입력의 시작이나 끝 위치에서 빈 레코드를 생성하지 않습니다. 줄 바꾸기 문자는 FS 특수 변수 값에 상관없이 항상 필드 구분자입니다.
RSTART match 함수에 의해 일치하는 문자열의 시작 위치(1부터 번호 매김)입니다. match 함수의 리턴 값과 같습니다.
SUBSEP 다중 첨자를 구분합니다. 디폴트는 \031입니다.

플래그

항목 설명
-f ProgramFile ProgramFile 변수로 지정된 파일로부터 awk 명령에 대한 명령어를 얻습니다. -f 플래그가 여러 번 지정되면 지정된 순서로 병합된 파일이 명령어 세트로 사용됩니다.
-u 버퍼링되지 않은 모드로 출력을 표시합니다. 이 플래그를 사용하면 awk 명령을 출력을 버퍼링하지 않습니다. 대신, 즉시 출력을 표시합니다. 기본적으로 awk 명령은 버퍼링된 모드로 출력을 표시합니다.
-F Ere Ere 변수로 지정된 확장 정규식을 필드 구분자로 사용합니다. 디폴트 필드 구분자는 공백입니다.
-v Assignment awk 명령의 프로그래밍 언어에서 변수에 값을 지정합니다. Assignment 매개변수는 Name = Value 양식입니다. Name 부문은 변수 이름을 지정하고, 밑줄, 숫자, 영문자의 조합일 수 있습니다. 단, 밑줄 또는 영문자로 시작해야 합니다. Value 부분도 밑줄, 숫자, 영문자로 구성되며, 앞뒤에 "(문자열 값과 비슷하게 이중 인용 부호)가 있는 경우처럼 처리됩니다. Value 부분이 숫자인 경우, 변수에도 숫자 값이 지정됩니다.

-v 플래그에 의해 지정된 지정은 BEGIN 섹션을 포함하여 awk 명령 프로그램의 일부가 실행되기 전에 수행됩니다.

Assignment awk 명령의 프로그래밍 언어에서 변수에 값을 지정합니다. 각각 처리되는 시간을 제외하고 -v 플래그를 포함하는 Assignment 변수와 양식 및 기능이 동일합니다. Assignment 매개변수는 명령행에서 이 뒤에 나오는 입력 파일(File 변수로 지정됨) 바로 앞에서 처리됩니다. Assignment 매개변수가 여러 입력 파일의 첫 번째 파일 바로 앞에 지정되면 지정은 BEGIN 섹션(있는 경우) 바로 뒤에서 처리됩니다. 마지막 파일 이후에 Assignment 매개변수가 나타나면 END 섹션(있는 경우) 전에 지정이 처리됩니다. 입력 파일이 지정되지 않은 경우, 지정이 처리되고 표준 입력을 읽습니다.
File 처리를 위한 입력을 포함하고 있는 파일 이름을 지정합니다. File 변수가 지정되지 않거나 -(빼기) 기호가 지정된 경우 표준 입력이 처리됩니다.
'Program' awk 명령에 대한 명령어를 포함합니다. -f 플래그를 지정하지 않은 경우 Program 변수는 명령행의 첫 번째 항목이어야 합니다. 이는 ' '(단일 인용 부호)로 묶어야 합니다.

종료 상태

이 명령은 다음과 같은 종료값을 리턴합니다.

항목 설명
0 성공적으로 완료되었습니다.
>0 오류가 발생했습니다.

exit [ Expression ] 조건문을 사용하여 프로그램 내에서 종료 상태를 변경할 수 있습니다.

예제

  1. 72자보다 긴 파일 행을 표시하려면 다음을 입력하십시오.
    awk  'length  >72'  chapter1
    이 명령은 chapter1 파일에서 72자보다 긴 각 행을 선택하여 이 행을 표준 출력으로 작성합니다. Action이 지정되지 않았기 때문입니다. 탭 문자는 1바이트로 계산됩니다.
  2. 단어 startstop 사이의 모든 행을 표시하려면( "start""stop" 포함) 다음을 입력하십시오.
    awk  '/start/,/stop/'  chapter1
  3. chapter1 파일을 처리하는 awk 명령 프로그램, sum2.awk를 실행하려면 다음을 입력하십시오.
    awk  -f  sum2.awk  chapter1
    다음 프로그램, sum2.awk는 입력 파일, chapter1의 두 번째 열에서 숫자의 합계와 평균을 계산합니다.
        {
           sum += $2
        }
    END {
           print "Sum: ", sum;
           print "Average:", sum/NR;
        }
    첫 번째 조치는 각 행의 두 번째 필드 값을 변수 sum에 더합니다. 모든 변수는 처음 참조될 때 0(영) 숫자 값으로 초기화됩니다. 두 번째 조치 앞에 나오는 END 패턴으로 해당 조치는 입력 파일 모두를 읽은 후에 수행됩니다. 평균을 계산하기 위하여 사용되는 NR 특별 변수는 읽은 레코드의 수를 지정하는 특별 변수입니다.
  4. 반대 순서로 처음 두 개 필드를 인쇄하려면 다음을 입력하십시오.
    awk '{ print $2, $1 }' chapter1
  5. 다음의 awk 프로그램의 경우:
    awk -f sum3.awk chapter2
    쉼표 및/또는 공백과 탭으로 입력 파일을 구분하여 파일 chapter2의 처음 두 개 필드를 인쇄하고 첫 번째 열을 더하고 합계와 평균을 인쇄합니다.
    BEGIN  {FS = ",|[ \t]+"}
           {print $1, $2}
           {s += $1}
    END    {print "sum is",s,"average is", s/NR }