| HOME / 정보공유 / AIX 명령어 모음

awk
awk awk 명령 목적 파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행합니다. 구문
awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...
설명
awk 명령은 사용자 정의 명령어 집합을 활용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교합니다. 그런 다음, 확장 정규식과 일치하는 모든 행에 조치를 실행합니다. awk 명령이 처리하는 최대 레코드 크기는 10KB입니다.
awk 명령의 패턴 탐색은 grep 명령의 패턴 탐색보다 더 일반적이고, 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있게 합니다. awk 명령 프로그래밍 언어는 컴파일을 필요로 하지 않고, 변수, 수치 함수, 문자열 함수 및 논리적 연산자를 사용하는 것을 허용합니다.
awk 명령은 LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH 및 PATH 환경 변수의 영향을 받습니다.
다음 주제들이 본 조항에 설명되어 있습니다.
awk 명령에 대한 입력
awk 명령의 출력
레코드와 필드를 갖는 파일의 처리
awk 명령 프로그래밍 언어
패턴
조치
변수
특수 변수
플래그
예제
awk 명령에 대한 입력
awk 명령은 두 종류의 입력, 입력 텍스트 파일과 프로그램 명령어를 받아들입니다.
입력 텍스트 파일
탐색과 조치는 입력 텍스트 파일상에서 실행됩니다. 입력 텍스트 파일은 다음 방식으로 지정됩니다.
명령행에서 File 변수를 지정.
특수 변수 ARGV 및 ARGC 수정.
File 변수가 없을 경우 표준 입력 제공.
File 변수로 여러 개의 파일을 지정하면, 지정된 순서대로 파일이 처리됩니다.
프로그램 명령
사용자가 제공하는 명령은 awk 명령의 조치를 제어합니다. 이 명령어는 명령행에서 `Program' 변수를 사용해 입력하거나, ProgramFile 변수와 -f 플래그에 의해 지정된 파일을 사용해 입력할 수 있습니다. 여러 프로그램 파일이 지정되면, 파일은 지정된 순서에 따라 병합되고 그 결과로 생성되는 명령어의 순서가 사용됩니다.
awk 명령의 출력
awk 명령은 입력 텍스트 파일에 있는 데이터로부터 세 가지 종류의 결과를 출력합니다.
선택된 데이터는 입력 파일에 대한 변경 없이 표준 출력에 인쇄될 수 있습니다.
입력 파일 중 선택된 부분을 변경할 수 있습니다.
선택된 데이터는 입력 파일 내용의 변경 여부와는 상관없이 변경되고 표준 출력에 인쇄됩니다.
세 종류의 출력 모두 같은 파일에서 수행될 수 있습니다. awk 명령으로 인식되는 프로그래밍 언어를 사용하면 사용자가 출력의 방향을 재지정할 수 있습니다.
레코드와 필드를 갖는 파일의 처리
파일은 다음과 같은 방법으로 처리됩니다.
awk 명령은 명령을 스캔하고 입력 파일을 읽기 전에 지정된 조치를 실행합니다.
사용자는 awk 프로그래밍 언어의 BEGIN문을 사용하여, 첫번째 레코드를 읽기 전에 실행해야 할 명령어 집합을 지정할 수 있습니다. 이 방법은 특수 변수를 초기화하는 데 특히 유용합니다.
입력 파일에서 하나의 레코드를 읽습니다.
레코드는 레코드 분리자로 서로가 구분된 데이터의 집합입니다. 디폴트 레코드 분리자는 개행 문자입니다. 개행 문자는 파일의 각 행을 별개의 레코드로 만듭니다. 레코드 분리자는 RS 특수 변수를 설정하여 변경할 수 있습니다.
레코드는 awk 명령의 지침으로 지정된 각 패턴과 비교됩니다.
awk 명령의 명령어는 레코드 내의 특정 필드만이 비교되도록 지정할 수 있습니다. 디폴트로, 필드는 공백 문자(공백 또는 탭)에 의해 구분됩니다. 각 필드는 필드 변수에 의해 참조됩니다. 레코드의 첫번째 필드에는 $1 변수가 할당되고, 두 번째 필드에는 $2 변수가 할당되고, 나머지 필드도 마찬가지로 변수가 할당됩니다. 레코드 전체에는 $0 변수가 할당됩니다. 필드 분리자는 명령행에서 -F 플래그를 사용하거나 FS 특수 변수를 설정하여 변경할 수 있습니다. FS 특수 변수는 공백, 단일 문자 또는 확장 정규식의 값으로 설정할 수 있습니다.
레코드가 패턴과 일치하면, 패턴과 관련된 조치를 레코드에 실행합니다.
레코드가 각 패턴과 비교되고, 지정된 모든 조치가 수행된 후 입력으로부터 다음 레코드를 읽습니다. 입력 파일에서 모든 레코드를 읽을 때까지 이 과정을 반복합니다.
지정된 입력 파일이 하나가 아니면, 다음 파일을 읽고 위의 과정을 반복합니다. 모든 파일을 읽을 때까지 이 과정을 반복합니다.
마지막 파일의 마지막 레코드를 읽은 후에, awk 명령은 입력 처리 후에 발생하도록 지정된 명령을 실행합니다.
사용자는 awk 프로그래밍 언어의 END문을 사용하여 마지막 레코드를 읽은 후 수행해야 할 조치를 지정할 수 있습니다. 이 명령은 특히 awk 명령에 의해 수행된 작업에 대한 메세지를 보내는 데 유용합니다.
awk 명령 프로그래밍 언어
awk 명령 프로그래밍 언어는 다음과 같은 형태의 문으로 구성됩니다.
Pattern { Action }
레코드가 지정된 패턴과 일치하거나 패턴과 일치하는 필드를 가지고 있으면, 관련된 조치가 실행됩니다. 조치를 가지고 있지 않은 패턴을 지정할 수도 있습니다. 이 경우 패턴을 포함하고 있는 전체 행이 표준 출력 장치에 출력됩니다. 패턴이 없이 지정된 조치는 모든 입력 레코드에 실행됩니다.
패턴
awk 명령 언어 구문에서 사용되는 패턴에는 4가지 유형이 있습니다.
정규식
관계식
패턴의 조합
BEGIN과 END 패턴.
정규식
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
? ?(물음표) 앞에 있는 문자나 확장 정규식이 문자열에 없거나 또는 한 번 나타나면 문자열이 일치한다는 것을 지정합니다. 나타나면 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/smith?/' testfile
위의 명령은 smit가 있고, 그 뒤에 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} m과 n을 포함하여 이 문자 사이에 있는 문자가 문자열 내에 있으면(여기서 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
*(asterisk) 문자가 하나 또는 그 이상임을 나타냅니다. 예를 들면 다음과 같습니다.
awk '/a.*e/' testfile
문자 a와 e가 0 또는 더 많은 문자로 분리되는 모든 레코드를 표준 출력에 인쇄합니다. 이 예제의 출력은 다음과 같습니다.
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\ (backslash) 에스케이프 문자. 에스케이프 문자가 확장 표현식 내에서 특별한 의미를 가지고 있는 문자 앞에 있으면, 문자로부터 특별한 의미를 제거합니다. 예를 들면 다음과 같습니다.
/a\/\//
a// 패턴과 일치합니다. 왜냐하면, 백슬래쉬가 슬래쉬가 정규식의 분리문자라는 통상적인 의미를 부정하기 때문입니다. 백슬래쉬 그 자체를 문자로 지정하려면, 이중 백슬래쉬를 사용해야 합니다. 백슬래쉬와 그 사용에 대한 자세한 정보는 에스케이프 순서에 관한 다음 항목을 참조하십시오.
인식되는 에스케이프 순서
awk 명령은 awk 명령에 의해 특별한 문자로 사용되는 에스케이프 순서뿐 아니라 C 언어에서 통례적으로 사용되는 대부분의 에스케이프 순서를 인식합니다. 에스케이프 순서는 다음과 같습니다.
에스케이프 순서 의미하는 문자
\" \"(큰따옴표) 기호
\/ /(슬래쉬) 문자
\ddd 인코딩이 한 자리, 두 자리 또는 세 자리의 8진수 정수로 표현되는 문자. 여기서 d는 8진수를 나타냅니다.
\\ \(백슬래쉬) 문자
\a 경보 문자
\b 백스페이스 문자
\f 페이지 넘김 문자(FF)
\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가 들어 있는 레코드를 찾아냅니다.
괄호( )는 패턴을 묶습니다.
부울 연산자 ||(또는), &&(및), !(NOT)은 패턴을 결합해 결합된 그 값이 참이면 일치하고 참이 아니면 불일치하는 표현식을 생성합니다. 예를 들면 다음과 같습니다.
$1 == "al" && $2 == "123"
첫번째 필드가 al이고 두번째 필드가 123인 레코드를 찾아냅니다.
BEGIN 및 END 패턴
BEGIN 패턴으로 지정된 조치는 모든 입력을 읽기 전에 수행됩니다. END 패턴으로 지정된 조치는 모든 입력을 읽은 다음 수행됩니다. 여러 개 BEGIN 및 END 패턴은 지정된 순서로 허용되고 처리됩니다. 프로그램 문에서 END 패턴이 BEGIN 패턴 앞에 올 수 있습니다. 프로그램이 BEGIN 명령문만으로 구성된 경우, 조치가 수행되며 어떠한 입력도 읽지 않습니다. 프로그램이 END 명령문만으로 구성된 경우, 모든 입력은 조치를 취하기 전에 읽습니다.
조치
여러 종류의 조치문이 존재합니다.
조치문
내장 함수
사용자 정의 함수
조건문
출력문
조치 문
조치문은 { }(중괄호)로 둘러 쌉니다. 패턴 없이 문이 지정되면, 조치는 모든 레코드에 실행됩니다. 괄호 안에 다중 조치를 지정할 수 있습니다. 그러나 각 조치들은 개행 문자 또는 ;(세미콜론)으로 구분되어야 하고, 조치문은 나타나는 순서대로 처리됩니다. 조치문은 다음을 포함하고 있습니다.
산술문
산술 연산자 +(더하기 부호), -(빼기 부호), /(나눗셈), ^(지수화), *(곱셈), %(모듈러스)는 다음 형태로 사용됩니다.
Expression Operator Expression
예를 들면 다음과 같습니다.
$2 = $1 ^ 3
위 산술문은 첫번째 필드의 세제곱을 두 번째 필드에 지정합니다.
16진법 문
단항 - (빼기) 및 단항 + (더하기)는 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)
여기서 pow는 pow 서브루틴이고 fmod는 fmod 서브루틴입니다.
문자열 병합문
문자열 값을 나란히 놓음으로써 병합할 수 있습니다. 예를 들면 다음과 같습니다.
$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 함수의 시드 값을 Expr 매개변수의 값으로 설정하거나, Expr 매개변수를 생략할 경우 하루 중 시간을 사용합니다. 이전 시드 값이 출력됩니다.
문자열 기능
문자열 함수는 다음과 같습니다.
gsub( Ere, Repl, [ In ] ) 나타나는 모든 정규식이 대체된다는 것을 제외하고, sub 함수와 똑같은 기능을 합니다.
sub(Ere, Repl, [ In ] ) In 매개변수로 지정된 문자열에서 Ere 매개변수에 의해 지정된 확장 정규식 중 첫번째 정규식을 Repl 매개변수에 의해 지정된 문자열로 대체합니다. sub 함수는 대체 횟수를 출력합니다. Repl 매개변수로 지정하는 문자열에 표시되는 &(앰퍼샌드)는 Ere 매개변수가 지정한 확장 정규식과 일치하는 In 매개변수의 문자열로 대체합니다. In 매개변수를 지정하지 않으면, 디폴트 값은 레코드 전체($0 레코드 변수)입니다.
index(String1, String2) String2 매개변수로 지정된 문자열이 나타나는 String1 매개변수로 지정된 문자열에서 1부터 번호를 매겨 위치를 리턴합니다. String2 매개변수가 String1 매개변수에 나타나지 않으면, 0(제로)이 리턴됩니다.
length [(String)] String 매개변수로 지정된 문자열의 길이를 문자 수로 리턴합니다. String 매개변수를 지정하지 않으면, 전체 레코드의 길이($0 레코드 변수)가 리턴됩니다.
blength [(String)] String 매개변수로 지정된 문자열의 길이를 바이트 단위로 리턴합니다. String 매개변수를 지정하지 않으면, 전체 레코드의 길이($0 레코드 변수)가 리턴됩니다.
substr(String, M, [ N ] ) N 매개변수로 지정된 문자 수가 있는 부분 문자열을 리턴합니다. 부분 문자열은 String 매개변수가 지정한 문자열 내에서, M 매개변수가 지정한 위치에 있는 문자로부터 시작하여 선택됩니다. M 매개변수는 번호 1로, String 매개변수의 첫번째 문자로 지정됩니다. N 매개변수를 지정하지 않으면 String 매개변수의 끝에 도달할 때까지 부분 문자열의 길이가 M 매개변수로 지정된 위치부터 시작됩니다.
match( String, Ere) Ere 매개변수로 지정된 확장 정규식이 나타나는 String 매개변수로 지정된 문자열에서 1부터 번호를 매겨 문자의 위치를 리턴합니다. 그렇지 않고, Ere 매개변수가 없으면 0(제로)를 리턴합니다. 만약 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 아닌 값이 출력됩니다. 그렇지 않으면 0이 아닌 값이 출력됩니다. 파일을 작성하고 작성된 파일을 나중에 같은 프로그램 내에서 읽으려면 close문이 반드시 있어야 합니다.
system(Command) Command 매개변수로 지정된 명령을 실행하고 종료 상태를 리턴합니다. 이 문은 system 서브루틴과 동등합니다.
Expression | getline [ Variable ] Expression 매개변수로 지정된 명령의 출력으로부터 파이프된 스트림에서 입력 레코드를 읽어 레코드 값을 Variable 매개변수로 지정된 변수에 할당합니다. Expression 매개변수의 값을 이름으로 갖는 스트림이 현재 열려져 있지 않으면 스트림이 작성됩니다. 생성된 스트림은 Expression 매개변수의 값과 r 값으로 설정된 Mode 매개변수를 취하는 Command 매개변수와 함께 popen 서브루틴을 호출하여 작성한 스트림과 동등합니다. 스트림이 열려져 있고 Expression 매개변수의 값이 동일한 문자열로 평가되는 한, getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. 만약 Variable 매개변수를 지정하지 않으면, $0 레코드 변수와 NF 특수 변수는 스트림으로부터 읽은 레코드로 설정됩니다.
getline [ Variable ] 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이 전달됩니다. 이 때, n은 배열에 있는 요소의 개수입니다. 그러면 함수는 평균을 구하고 그 값을 출력합니다.
조건문
awk 명령 프로그래밍 언어에서 대부분의 조건문은 C 프로그래밍 언어의 조건문과 같은 구문 및 기능을 갖습니다. 모든 조건문은 명령문을 함께 그룹화하기 위해 { }(중괄호)의 사용을 허용합니다. 조건문의 표현식 부분과 문 부분사이에 선택적인 개행을 사용할 수 있습니다. ;(세미콜론)을 사용해 { }(중괄호) 안에 있는 다중 문을 구분합니다. C 언어의 여섯 가지 조건문은 다음과 같습니다.
if 다음과 같은 구문을 필요로 합니다.
if ( Expression ) { Statement } [ elseAction ]
while 다음과 같은 구문을 필요로 합니다.
while ( Expression ) { Statement }
for 다음과 같은 구문을 필요로 합니다.
for ( Expression ; Expression ; Expression ) { Statement }
break while 또는 for 문에서 break 문이 사용될 때 프로그램 루프를 종료시킵니다.
continue while 또는 for 문에서 continue 문이 사용될 때 프로그램 루프를 다음 반복문으로 이동시킵니다.
awk 명령 프로그래밍 언어에서 C 언어 규칙을 따르지 않은 다섯 가지 조건문은 다음과 같습니다.
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 조치를 나타나는 순서대로 호출한 다음, awk 명령을 종료하고, Expression 매개변수로 지정된 종료 상태를 표시합니다. END 조치 내에 exit 문이 있으면 이후의 END 조치는 호출되지 않습니다.
# 다음과 같은 구문을 필요로 합니다.
# Comment
# 명령문은 주석을 지정합니다. 주석은 항상 개행으로 끝나야 하지만 행 중 어디에서든지 시작할 수 있습니다.
next 현재 입력 레코드의 처리를 중지하고 다음 입력 레코드로 넘어갑니다.
출력 문
awk 명령 프로그래밍 언어의 두 출력문은 다음과 같습니다.
print 다음과 같은 구문을 필요로 합니다.
print [ ExpressionList ] [ Redirection ] [ Expression ]
print 문은 ExpressionList 매개변수로 지정된 각 표현식의 값을 표준 출력에 기록합니다. 각 표현식은 OFS 특수 변수의 현재 값으로 분리되고, 각 레코드는 ORS 특수 변수의 현재 값으로 종료됩니다.
Redirection 매개변수를 사용해 출력 방향을 전환할 수 있는데, Redirection 매개변수는 출력 방향을 > (보다 크다), >> (이중 크다 기호) 그리고 |(파이프)를 사용해 세 가지로 전환할 수 있습니다. Redirection 매개변수는 출략의 재지정 방법을 지정하고, Expression 매개변수는 파일의 경로 이름(Redirection 매개변수가 > 또는 >>일 경우) 또는 명령의 이름 (Redirection 매개변수가 |일 경우)이 됩니다.
printf 다음과 같은 구문을 필요로 합니다.
printfFormat [ , ExpressionList ] [ Redirection ] [ Expression ]
printf 문은 ExpressionList 매개변수로 지정된 표현식을 Format 매개변수로 지정된 형식으로 표준 출력에 기록합니다. printf 문은 c 변환 스펙(%c)을 제외하고, printf 명령과 똑같은 기능을 수행합니다. Redirection과 Expression 매개변수는 print문에서와 같은 가능을 합니다.
c 변환 스펙: 인수가 수치 값을 가지고 있으면, 코드화했을 때 그 값을 갖는 문자가 출력됩니다. 값이 0이거나 문자 세트에 있는 문자의 코드가 아니면, 변환은 정의되지 않습니다. 인수가 수치 값을 가지고 있지 않으면, 문자열 값의 최초 문자가 출력됩니다. 문자열이 아무런 문자도 포함하고 있지 않으면, 변환은 정의되지 않습니다.
주: Expression 매개변수가 Redirection 매개변수의 경로 이름을 지정할 경우, Expression 매개변수를 큰 따옴표로 묶어 문자열로 간주되도록 해야 합니다.
변수
변수는 스칼라, 필드, 변수, 배열 또는 특수 변수가 될 수 있습니다. 변수의 이름은 숫자로 시작해서는 안 됩니다.
변수는 참조하기만 하면 사용할 수 있습니다. 함수의 매개변수를 제외하면, 함수는 명시적으로 선언되지 않습니다. 초기화되지 않은 스칼라 변수와 배열 요소는 수치 값 0(영)과 문자열 값인 공 문자열(" ")을 취합니다.
변수는 문맥에 따라 수치 값이나 문자열 값을 취합니다. 각 변수는 수치 값, 문자열 값 또는 둘 다를 가질 수 있습니다. 예를 들면 다음과 같습니다.
x = "4" + "8"
12의 값을 변수 x에 지정합니다.
수치와 문자열간의 명시적인 변환은 없습니다. 표현식이 수치로 취급되게 하려면, 표현식에 0을 추가하십시오. 표현식이 문자열로 취급되게 하려면, 표현식에 널 문자열(" ")을 추가하십시오.
필드 변수
필드 변수는 $(달러 기호) 다음에 숫자 또는 수식으로 지정됩니다. 레코드의 첫번째 필드에는 $1 변수가 할당되고, 두 번째 필드에는 $2 변수가 할당되고, 나머지 필드도 마찬가지로 변수가 할당됩니다. $0 필드 변수는 전체 레코드에 지정됩니다. 새 필드 변수는 값을 지정하여 생성될 수 있습니다. 존재하지 않는 필드에 값을 지정하면, 즉 $NF 필드 변수의 현재 값보다 큰 필드에 값을 지정하면, 중재 필드가 작성되고(널 문자열로 설정), NF 특수 변수의 값이 증가되며, $0 레코드 변수의 값이 다시 계산됩니다. 새 필드는 현재 필드 분리자 ( FS 특수 변수의 값)으로 분리됩니다. 공백 및 탭은 디폴트 필드 구분자입니다. 필드 분리자를 변경하려면, -F 플래그를 사용하거나, FS 특수 변수를 awk 명령 프로그램의 다른 값으로 지정하십시오.
배열
배열은 처음에는 비어 있고, 그 크기는 동적으로 변합니다. 배열은 첨자를 가지고 있는 변수를 [ ](대괄호)로 나타냅니다. 첨자 또는 요소 식별자는 결합적 배열 능력을 제공하는 여러 문자가 될 수 있습니다. 예를 들면 다음과 같습니다.
/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문입니다. 이 경우, 지정이 평가됩니다.
다음 멤버가 널 값을 가지고 있습니다. 이 경우, 멤버는 생략됩니다. 입력 파일을 포함하고 있는 ARGV 배열을 널 값에 지정함으로써 프로그램은 선택된 입력 파일을 생략할 수 있습니다.
다음 멤버는 awk 명령이 입력 파일의 끝으로 해석하는 ARGV [ARGC -1]의 현재 값입니다.
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 조치 내에서, Variable 매개변수 없이 방향이 재지정된 후속 getline 함수가 END 조치를 입력하기 전에 수행되지 않는 한, NF 특수 변수는 마지막으로 읽은 레코드에 대한 값을 보유합니다.
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 플래그가 여러 번 지정되면 지정된 순서로 병합된 파일이 명령어 집합으로 사용됩니다.
-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 ] 조건문을 사용하여 프로그램에서 종료 상태를 변경할 수 있습니다.
예제
72자보다 긴 행을 표시하려면 다음과 같이 입력하십시오.
awk 'length >72' chapter1
이 명령은 chapter1 파일에서 72자보다 긴 행을 선택하여 선택한 행을 표준 출력에 기록합니다. 이는 Action이 지정되지 않았기 때문입니다. 탭 문자는 1바이트로 계수됩니다.
"start" 및 "stop"을 포함하여 단어 start와 stop 사이에 있는 모든 행을 표시하려면, 다음과 같이 입력하십시오.
awk '/start/,/stop/' chapter1
파일 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 특별 변수는 지금까지 읽은 레코드의 수를 나타내는 특별 변수입니다.
처음 두 개의 필드를 반대 순서로 인쇄하려면, 다음과 같이 입력하십시오.
awk '{ print $2, $1 }' chapter1
다음 awk 프로그램 sum3.awk는 입력 필드가 쉼표와 또는 공백 그리고 탭으로 구분되어 있는 chapter2 파일의 최초 두 필드를 인쇄하고 첫번째 열을 더하여 합계와 평균을 인쇄합니다.
BEGIN {FS = ",|[ \t]+"}
{print $1, $2}
{s += $1}
END {print "sum is",s,"average is", s/NR }
관련 정보
egrep 명령, fgrep 명령, grep 명령, lex 명령, printf 명령, sed 명령.
popen 서브루틴, printf 서브루틴, system 서브루틴.