Skip to content

Awk

컴파일 없이 수행되는 프로그래밍 언어의 하나. 공동 개발자인 A. V. Aho, P. J. Weinberger, B. W. Kernighan 등 세 사람 이름의 첫 글자를 따서 지은 명칭이다. C언어와 같은 복잡한 언어가 실제로는 대부분 자료나 문서 정리와 같은 단순 작업에 사용됨에 착안하여, 좀 더 자료 처리에 편리하도록 단순화한 것이다. 입력 파일을 스캔한 후 미리 지정된 레코드 분리자(record separator) 단위로 읽어 필드 분리자(field separator)로 필드(field)마다 규칙적인 명칭을 붙인다. 기본 설정으로 레코드 분리자는 리턴(new line), 필드 분리자는 공백(blank)과 탭(tap)이며, 레코드 즉 전체 필드는 $0, 첫 번째 필드는 $1, 두 번째는 $2, ... 등으로 명명된다. 동작은 매번 레코드를 읽어 필드 속의 패턴(pattern)에 따라 프로그램된 액션(action)이 수행되는 단순한 구조로, 데이터 검사, 변환, 여러 포맷으로의 출력, 데이터베이스 구축 등에 활용된다.

Options

-F
필드 구분자를 지정한다.
ex) awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } '
-v 변수=값
스크립트를 실행하기 전에 미리 변수에 값을 지정.
-f
스크립트 파일을 지정.

구조

  • 시작 (BEGIN): 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계
  • 실행 (Routine): 잘 덩리된(정규화된) 데이터를 실제 루틴으로 처리하는 단계
  • 종료 (END): 데이터가 처리된 후에 결과의 추가 출력

내장 변수

시스템 변수

설명

FILENAME

현재 파일명

FS

입력 필드 구분 (기본값: ' ' - 공백 -)

NF

현재 레코드 필드 갯수

NR

현재 레코드 번호

OFMT

숫자에 대한 출력 포맷 (기본값: $.6g)

OFS

출력 필드 구분 (기본값: 빈줄)

ORS

출력 레코드 구분 (기본값: newline)

RS

입력 레코드 구분 (기본값: newline)

$0

입력 레코드

$n

입력 레코드의 N번째 필드

ARGC

커맨드 라인의 인자 개수

ARGV

커맨드 라인 인자를 포함하는 배열

ENVIRON

환경 변수들을 모아둔 관계형 배열

FNR

NR과 동일. 단지 현재 파일에 적용된다는 점이 다름

RSTART

지정한 매칭 연산을 만족하는 문자열의 맨 앞부분

RLENGTH

지정한 매칭 연산을 만족하는 문자열의 길이

연산자

산술연산자

=, +=, -=, *=, /=, %=

조건연산자

(condition)? (true) : (fales)

논리연산자

||, &&, !

패턴연산자

~, !~

비교연산자

<, <=, >, >=, !=, ==

증감연산자

++, --

필드참조

$

제어문

  • break
  • continue
  • do { Routine } while (condition)
  • exit
  • for ( init ; condition ; re ) { Routine }
  • if ( condition ) { Routine } else { Routine }
  • while (condition) { Routine }
  • return

함수

문자열 함수

함수명

설명

gsub(r, s)

입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로 치환한다.

gsub(r, s1, s2)

입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로 치환한다.

index(s1, s2)

s1에서 s2의 위치를 넘겨준다. 없다면 0

length(arg)

인자의 길이를 넘겨준다.

match(s, r)

문자열 s에서 정규식표현 r과 매칭 되는 부분의 위치를 넘겨준다.

split(string, array[, seperator])

구분자를 기준으로(기본:공백)해서 지정한 문자열을 배열로 만든다.

sub(r, s) , sub(r, s1, s2)

gsub 와 동일 정규식식표현과 일치하는 문자열이 여러개라도 처음 한 문자열만 치환

substr(s, m)

문자열 s 에서 m번째 위치에서 끝까지 문자열을 넘겨준다.

substr(s, m, n)

문자열 s 에서 m번째 부터 n번째까지의 문자열을 넘겨준다

tolower(string)

대문자를 소문자로 바꾼다.

toupper(string)

소문자를 대분자로 바꾼다.

수학 함수

함수명

설명

atan2(x, y)

archtangent 값

cos(x)

cos 값

exp(x)

자연대수 e의 제곱

int(x)

정수형으로 반환

log(x)

로그

rand()

0에서 1까지의 랜덤수

sin(x)

sin 값

sqrt(x)

제곱근

srand(expr)

인자를 가진 난수(없으면 시간을 가지고 난수 발생)

입출력 함수

함수명

설명

close(filename)

지정한 파일을 닫는다.

close(cmd)

지정한 명령어 파이프를 닫는다.

delete array[element]

지정한 배열요소를 지운다.

getline()

다음 레코드를 읽어 들인다.

getline [variable] [< "filename"]

파일에서 읽어드린다.

next

다음 레코드를 입력받는다.

print [args] [> "filename"]

인자를 출력한다

printf "format" [,exp] [> "filename"]

형식에 맞춰 인자를 출력한다.

sprintf(format [,exp])

printf와 마찬가지로 사용되지만 값을 리턴하기만 하고 출력은 하지 않는다.

system(cmd)

시스템 내부 명령어를 실행한다.

여러 줄의 결과를 합치는 방법

다음의 도구를 사용하는 방법이 있다:

TODO

테스트 해 봐야 한다

awk ' /LABEL/ {f=3} f-->0 {$1=$1;printf "%s ",$0} f==0 {print ""}' file

Example

GCC Include directory

GCC의 INCLUDE디렉터리 목록을 열람할 수 있는 bash샘플은 아래와 같다.

$ echo | gcc -Wp,-v -x c - -fsyntax-only 2>&1 \
    | awk 'BEGIN{FS="[ \t]";RS="[\r\n]";s="#include <...> search starts here:";e="End of search list.";i=0;}{if($0!=""){if($0==e){i=0;}if(i==1){print($0);}if($0==s){i=1;}}}'

참고로 정리된 AWK 문법은 아래와 같다.

BEGIN {
    FS = "[ \t]";
    RS = "[\r\n]";
    s = "#include <...> search starts here:";
    e = "End of search list.";
    i = 0;
}
{
    if ($0 != "") {
        if ($0 == e) {
            i = 0;
        }
        if (i == 1) {
            print($0);
        }
        if ($0 == s) {
            i = 1;
        }
    }
}
END {
}

Column print

$ cat text.txt | awk '{printf("%-50s %-50s\n", $2, $3);}'

Text Processing Commands

텍스트 처리 명령어 목록

Text

Common

grep, sed, awk, cat, xargs, rev, tee, ack, tr, stdbuf

Diff

diff, patch

Cutting

cut, head, tail, less, more, split, watch

Sort

uniq, sort

Hash

base64, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum

Clipboard

clip (Windows), pbcopy (Mac OSX), pbpaste (Mac OSX), xclip (Debian)

E.T.C

regexp, parallel

See also

Favorite site

Tutorials

References


  1. Gnu-software-gawk.zip 

  2. Www.ibm.com-au-gawk.zip 

  3. Www.ibm.com-au-unixtips3.zip 

  4. An_awk_primer.pdf 

  5. Comefeel_awk.pdf 

  6. Awk_sed_chunk_1.pdf 

  7. Awk_shell_programming.pdf 

  8. Mug896-awk-script-master-fd0223a.zip (2020-10-07)