AWK(1)

awk

명칭
awk - 패턴 지향형 검색·처리 언어

서식
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]

해설
awk 하 prog 또는 1 개(살) 이상의 -f progfile 의 형식에서 지정된 파일에 대해 지정된 패턴의 조에 매치 한 행을 글자 하나하나를 충실히 맞춰감적으로, 각 file (으)로부터 검색합니다. file 의 행이 패턴에 매치 했을 때에 실행하는 액션을, 각 패턴에 대해서 관련 지을 수 있습니다. 각 행은 모든 패턴-액션문에 있어서의 패턴부에 대해서 매치 해, 관련 지을 수 있었던 액션은 매치 한 패턴 각각 대해 실행됩니다. 파일명 - (은)는 표준 입력을 의미합니다. var=value 형식의 file (은)는 파일명이 아니고 대입으로서 다루어져 그것이 파일명이었을 경우에 열렸을 것이다 타이밍에 실행됩니다. -v 옵션 의 후에 계속된다 var=value 하 prog 하지만 실행되기 전에 대입됩니다. -v 옵션은 몇 개 있어도 상관하지 않습니다. -F fs 옵션은 입력 필드 구분자를 정규 표현 fs 에 정의합니다.

입력행은 통상 공백 또는 정규 표현 FS 에 의해 필드에 분해됩니다. 필드는 $1, $2, ... 그리고 나타내져 $0 하행 전체를 의미합니다. FS 하지만 눌이었던 경우에는, 입력행은 한 글자 마다 필드로 나눌 수 있습니다.

패턴-액션문은 이하와 같은 형식입니다

    pattern { action }

{ action } 하지만 없는 경우에는, 행을 표시합니다. pattern 가 없었던 경우에는, 항상 매치 합니다. 패턴-액션문은 개행 또는 세미콜론으로 분리됩니다.

액션은 문장의 줄입니다. 문장은 이하 중 어떤 것인가입니다:

    if( 식 )  문 [ else 문 ]
    while( 식 )  문
    for( 식 ; 식 ; 식 )  문
    for( var in array )  문
    do 문 while( 식 )
    break
    continue
    { [ 문 ... ] }
    식 	# 보통은  var = 식
    print [ 식의 줄 ] [ > 식 ]
    printf format [ ,  식의 줄 ] [ > 식 ]
    return [ 식 ]
    next	# 이 입력행에 관해서 나머지의 패턴을 스킵 하는
    nextfile	# 이 파일의 나머지를 스킵 해, 다음을 열어, 선두로부터 시작하는
    delete array[ 식 ]	# 배열 요소를 삭제하는
    delete array	# 배열의 모든 요소를 삭제하는
    exit [ 식 ]	# 즉시 종료하는; 스테이터스는 식  입니다

문장은 세미콜론, 개행, 오른쪽이나 개로 종단 됩니다. 하늘의 식의 줄 하 $0 (을)를 의미합니다. 캐릭터 라인 정수는 " " 로 묶어져 그 중에서는 통상의 C 이스케이프가 해석됩니다. 식은 캐릭터 라인이나 수치를 적절히 취급해, 그러한 캐릭터 라인이나 수치는 + - * / % ^ (지수)(이)나(공백에서 나타난다) 결합 연산자를 사용해 조립할 수 있습니다. ! ++ -- += -= *= /= %= ^= > >= < <= == ! = ? : 연산자도 식 중(안)에서 사용 가능합니다. 변수는 스칼라, ( x[i] 그리고 표현된다) 배열 요소, 또는 필드입니다. 변수는 눌 캐릭터 라인으로 초기화됩니다. 배열의 첨자는 숫자일 필요는 없고, 어떠한 캐릭터 라인이어도 상관하지 않습니다. 이 기능에 의해 연상 배열의 형태를 취하는 일도 가능하게 됩니다. [i, j, k] (와)과 같이 복수의 첨자를 이용하는 일도 가능합니다. 원가요소는 SUBSEP 의 값을 사용해 결합됩니다.

print 문장은 주어진 인수를 현재의 출력 필드 구분자를 이용해 표준 출력 (또는 >file 혹은 >>file 하지만 사용되고 있었을 경우에는 파일, |cmd 하지만 사용되고 있었을 경우에는 파이프)에 출력해, 출력 레코드 separator에 의해 종단 합니다. file (와)과 cmd (은)는 리터럴명 또는 환괄호로 묶어진 식이며, 다른 문장에서의 동일한 캐릭터 라인치는 같은 파일을 오픈하는 것을 나타냅니다. printf 문장은 인수의 리스트를 서식 ( printf(3) 참조) 에 따라 정형합니다. 편입 함수 close(expr) (은)는 파일 또는 파이프 expr (을)를 클로우즈 합니다. 편입 함수 fflush(expr) (은)는 버퍼링 되고 있는 파일 또는 파이프 expr (을)를 플래시 합니다.

수학 함수 exp, log, sqrt, sin, cos, atan2 (은)는 편입의 것입니다. 그 외의 편입 함수:

length
    인수 또는 인수가 없었던 경우에는 $0 (을)를 캐릭터 라인으로서 파악한 길이.

rand
    (0,1)의 난수

srand
    rand 용무의 종을 설정해, 이전의 종을 돌려줍니다.

int 정수치에 잘라서 버림

substr(s, m, n)
    s 의 1 으로부터 세어 m 번째의 위치로부터 n-캐릭터 의 부분 캐릭터 라인.

index(s, t)
    s 안의 캐릭터 라인 t 하지만 나타나는 위치, 나타나지 않았던 경우에는 0.

match(s, r)
    s 안의 정규 표현 r 하지만 나타나는 위치, 나타나지 않았던 경우에는 0. 변수 RSTART (와)과 RLENGTH 에, 매치 한 캐릭터 라인의 위치와 길이가 세트 됩니다.

split(s, a, fs)
    캐릭터 라인 s (을)를 배열 요소 a[1], a[2], ..., a[n], 에 분할해, n (을)를 돌려줍니다. 분할은 정규 표현 fs 또는 fs 하지만 주어지지 않았던 경우에는 필드 구분자 FS 에 의해 행해집니다. 필드 구분자가 하늘의 캐릭터 라인이었던 경우, 캐릭터 라인은 1 캐릭터 단위로 배열 요소에 분할됩니다.

sub(r, t, s)
    캐릭터 라인 s 안에 최초로 나타난 정규 표현 r (을)를 t 에 치환합니다. s 하지만 주어지지 않았던 경우에는, $0 하지만 이용됩니다.

gsub
    sub (와)과 같습니다만, 나타난 모든 정규 표현이 치환됩니다. sub (와)과 gsub (은)는 치환한 수를 돌려줍니다.

sprintf(fmt, expr, ... )
    서식 fmt 에 따라 expr ... (을)를 printf(3) 그리고 정형한 결과의 캐릭터 라인

system(cmd)
    cmd (을)를 실행해 종료 상태를 반환

tolower(str)
    str 안의 모든 대문자를 대응하는 등가의 소문자로 변환한 카피를 돌려줍니다.

toupper(str)
    str 안의 모든 소문자를 대응하는 등가의 대문자로 변환한 카피를 돌려줍니다.

``함수'' getline (은)는 현재의 입력 파일로부터 다음의 레코드를 $0 (으)로 설정합니다. getline <file 하 file (으)로부터 다음의 레코드를 $0 (으)로 설정합니다. getline x 의 경우는 대신에 변수 x (으)로 설정합니다. 마지막으로, cmd | getline 그럼 cmd 의 출력을 getline 에 파이프 해, getline 의 각각의 호출은 cmd 의 출력으로부터 다음의 행을 돌려줍니다. 모든 경우에 대해, getline (은)는 입력에 성공하면(자) 1 을 돌려주어, 파일의 종단에 이르면(자) 0 을 돌려주어, 에러가 되면(자) -1 를 돌려줍니다.

패턴은 임의의 수의 정규 표현이나 관계식의 ( ! || && 에 의한다) 논리적 편성입니다. 정규 표현은 egrep 의 그것과 같습니다. grep(1) (을)를 참조해 주세요. 패턴중의 단독 (isolated) 정규 표현은 행 전체에 걸립니다. 정규 표현은 ~ (이)나 !~ 연산자를 이용해, 관계식 중(안)에서도 사용할 수 있습니다. /re/ (은)는 변화하지 않는 정규 표현입니다. 패턴중의 단독 정규 표현이 되는 장소 이외에서는, 어떠한 캐릭터 라인 (정수 또는 변수)이어도 정규 표현으로서 사용할 수 있습니다.

패턴은 콤마로 2 개의 패턴에 단락지을 수가 있습니다. 이 경우, 1번째의 패턴과 2번째의 패턴의 사이에 있는 모든 행에 대해서 액션이 됩니다.

관계식은 이하 중 어떤 것인가입니다:

    식 matchop 정규 표현
    식 relop 식
    식 in 배열명
    (식,식,...) in 배열명

여기서 relop 는 C 에서의 6개의 관계 연산자의 어떤 것인가, matchop 는 ~ (매치 한다) or ! ~ (매치 하지 않는다) 가운데, 어느 쪽인지. 조건은 수식, 관계식, 또는 이러한 논리적 편성의 어떤 것인가입니다.

특별한 패턴 BEGIN (와)과 END (은)는 최초의 행을 읽기 전과 마지막 행을 읽은 뒤에 제어를 잡는데 사용할 수 있습니다. BEGIN (와)과 END (은)는 다른 패턴과 조합할 수 없습니다.

특별한 의미를 가지는 변수명:

CONVFMT
    수치를 변환할 때에 사용하는 변환 서식 (디폴트에서는 %. 6g)

FS  필드 분리에 사용하는 정규 표현. -Ffs 옵션에서도 지정할 수 있습니다.

NF  현재의 레코드에서의 필드수

NR  현재의 레코드의 서수

FNR 현재의 파일에서의 현재의 레코드의 서수

FILENAME
    현재의 입력 파일의 명칭

RS  입력 레코드 separator (디폴트에서는 개행)

OFS 출력 필드 구분자 (디폴트에서는 공백)

ORS 출력 레코드 separator (디폴트에서는 개행)

OFMT
    수치의 출력 서식 (디폴트에서는 %. 6g)

SUBSEP
    다차원 배열의 separator (디폴트에서는 034)

ARGC
    인수의 카운트, 대입 가능

ARGV
    인수의 배열, 대입 가능. 눌이 아닌 멤버는 파일명으로서 다루어집니다

ENVIRON
    환경 변수의 배열. 첨자는 이름입니다.

함수는 이하와 같이 (패턴-액션문의 위치에서) 정의할 수 있습니다:

    function foo(a, b, c) { ...; return x }

파라미터는 스칼라의 경우는 값으로, 배열명의 경우는 참조로 건네받습니다. 함수는 재귀적으로 호출해 가능합니다. 파라미터는 함수 로컬로, 그 이외의 변수는 글로벌입니다. 로컬 변수는 함수 정의시에 여분의 파라미터를 더하는 것으로 작성할 수 있습니다.

사용예

length($0) > 72
72 캐릭터보다 긴 행을 표시합니다.

{ print $2, $1 }
초의 2 필드를 역순으로 표시합니다.

    BEGIN { FS = ",[ \t]*|[ \t]+" }
          { print $2, $1 }

    같습니다만, 필드를 콤마, 공백, 탭으로 단락짓습니다.

    	{ s += $1 }
    END	{ print "sum is", s, " average is", s/NR }

    1번째의 컬럼을 더해 가 합계와 평균을 표시합니다.

/start/, /stop/
start 와 stop 의 편성의 사이의 행을 표시합니다.

    BEGIN	{	# echo(1)를 시뮬레이트 합니다
    	for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
    	printf "\n"
    	exit }

관련 항목
lex(1), sed(1)
A. V. Aho, B. W. Kernighan, P. J. Weinberger, The AWK Programming Language, Addison-Wesley, 1988. ISBN 0-201-07981-X

버그
수치와 캐릭터와의 사이의 명시적인 변환은 없습니다. 식을 강제적으로 수치로서 취급하게 하려면 , 0 을 더해 주세요. 식을 강제적으로 캐릭터로서 취급하게 하려면 , "" (을)를 결합해 주세요.
함수에 있어서의 변수의 스코프 규칙은 서툼입니다. 문법은 한층 더 심합니다.