Command-line options

-f progfile, --file progfile

메인 실행파일을 지정할 때 사용합니다. 이 옵션을 사용한 상태에서 명령행 상에서 quotes 을 이용해 코드를 작성하려면 -e 옵션을 사용해야 합니다. 여러번 사용할 수 있고 - 문자를 파일명에 사용할 경우 stdin 에서 입력을 받습니다.

-F fs, --field-separator fs

FS 값을 설정합니다.

-v var=val, --assign var=val

awk 에 변수값을 전달할 때 사용합니다. 여러 개를 사용할 수 있고 설정된 값은 BEGIN 블록에서도 사용할 수 있습니다.

-b, --characters-as-bytes

awk 는 기본적으로 텍스트 데이터를 다루는 프로그램이기 때문에 내부적으로 locale 에 따라서 multibyte characters 를 wide characters 로 converting 합니다. 하지만 이 옵션을 사용하면 데이터를 읽어 들일 때나, 프린트문으로 출력할 때 converting 없이 무조건 single-byte characters 로 취급합니다. 다시 말해서 원본 데이터에 아무런 손도 대지 않는 것입니다.

-d[file], --dump-variables[=file]

global 변수를 dump 해볼 때 사용합니다. 변수 type 과 value 가 표시되는데 함수 내에서 local 변수로 사용되야 될 변수가 실수로 global 변수가 되지 않았는지 살펴보는 용도로 활용할 수 있습니다. 옵션 인수인 파일명은 공백 없이 붙여야 되고 파일명을 제공하지 않을 경우는 awkvars.out 에 저장됩니다.

-D, --debug

awk 스크립트 파일을 디버깅할 때 사용합니다.

-e 'program-text', --source 'program-text'

명령행 상에서 quotes 을 이용해 직접 코드를 작성할 때 사용합니다. 보통은 이 옵션 없이도 코드를 작성할 수 있지만 -f 옵션을 이용해 메인 실행파일을 지정할 경우에는 이 옵션을 사용해야 됩니다. -i, -f 옵션은 명령행 상에 위치한 순서에 따라 실행되고 -e 옵션으로 작성한 코드는 마지막에 실행됩니다.

-E file, --exec file

이것은 awk 스크립트를 CGI 프로그램으로 사용할 경우 보안을 위한 옵션입니다. 기본적인 기능은 -f 옵션과 같지만 악의적인 사용자가 옵션 이나 변수값 전달, -e 옵션을 이용한 소스코드 전달을 하지 못하게 합니다. 따라서 명령 라인에 사용된 인수는 처리되지 않고 스트링으로만 전달됩니다.

awk -f-v 를 awk 옵션으로 인식해 오류가 발생하지만 awk -E 는 그대로 파일명으로 전달된다.

$ cat test.sh                $ cat test.sh                                              
#!/usr/bin/awk -E            #!/usr/bin/awk -f

BEGINFILE {                  BEGINFILE {
    print FILENAME               print FILENAME 
    nextfile                     nextfile
}                            }

$ ./test.sh -v hello         $ ./test.sh -v hello   # 오류
-v                           awk: 'hello' argument to '-v' not in 'var=value' form
hello                        . . .

만약에 옵션을 추가하려면 다음과 같이 -E 옵션 전에 위치시키면 ARG 에 포함되지 않습니다.

$ cat test.sh
#!/usr/bin/env -S gawk -v AA=100 -E

BEGIN {
    print "ARGC : " ARGC
    print "ARGV[0] : " ARGV[0]
    print "ARGV[1] : " ARGV[1]
    print "AA : " AA 
}

$ ./test.sh
ARGC : 1
ARGV[0] : gawk
ARGV[1] : 
AA : 100

-g, --gen-pot

서비스 메시지의 국제화를 위한 기능으로 소스 코드에서 특정 형식으로 작성된 스트링 상수를 추출하여 pot 파일 ( GNU gettext portable object template file ) 을 생성합니다.

https://www.gnu.org/software/gawk/manual/html_node/I18N-Example.html

-i includefile, --include includefile

라이브러리 파일을 include 하기 위한 것으로 -f 옵션과 다르게 메인 실행파일로 인식하지 않습니다. 한번 파일이 로드되면 중복 사용될 경우 다시 로드되지 않습니다. -f 옵션의 경우는 동일한 파일이 중복 사용될 경우 매번 실행됩니다. @include 키워드와 같은 기능을 합니다.

-l library, --load library

확장 모듈을 로드해 사용합니다. AWKLIBPATH 환경 변수에서 모듈을 찾습니다.

-L[fatal|invalid], --lint[=fatal|invalid]

이 옵션을 사용하면 오류가 의심되는 코드에 대해 다양한 메시지를 출력합니다.

-M, --bignum

cpu 에서 하드웨어 적으로 제공하는 64bit fixed-precision arithmetic 대신에 소프트웨어 라이브러리를 이용한 arbitrary-precision arithmetic ( 또는 bignum arithmetic, multiple precision arithmetic, infinite-precision arithmetic ) 연산을 합니다. 사용 가능한 정밀도의 한계는 컴퓨터 메모리 크기에 제한을 받을 뿐입니다.

연산 결과 값이 53 bits 를 넘을 경우 이 옵션을 설정해야 합니다.

# 72057594037927935 (0xFFFFFFFFFFFFFF) 는 7 bytes 으로 56 bits 값

$ awk 'BEGIN { print 72057594037927935 + 1}'
72057594037927936

$ awk 'BEGIN { print 72057594037927935 + 2}'
72057594037927936                                # 위와 동일한 값

$ awk 'BEGIN { print 72057594037927935 + 3}'
72057594037927936                                # 위와 동일한 값

$ awk 'BEGIN { print 72057594037927935 + 4}'
72057594037927936                                # 위와 동일한 값

# '-M' 옵션을 사용해야 정확한 값이 출력된다.
$ awk -M 'BEGIN { print 72057594037927935 + 4}'
72057594037927939

factorial 100 을 계산하는 것인데 -M 옵션을 사용해야 값이 정확해진다.

$ awk 'BEGIN { print fac(100) } 
function fac (n,    accum) { 
    accum = 1
    while (n >= 2) accum *= n--
    return accum
}' 
9332621544394417535430725413964319024712932813229586249193...........

$ awk -M 'BEGIN { print fac(100) }         # -M 옵션 사용
function fac (n,    accum) { 
    accum = 1
    while (n >= 2) accum *= n--
    return accum
}' 
9332621544394415268169923885626670049071596826438162146859..........

10,000 번째 피보나치수 구하기

$ awk 'BEGIN { print fibo(10000) }
function fibo (n,     a, b, i) { 
    a = b = 1;
    for (i = 3; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}'
+inf                                             # +inf

$ awk -M 'BEGIN { print fibo(10000) }            # -M 옵션 사용
function fibo (n,     a, b, i) { 
    a = b = 1;
    for (i = 3; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}'
3364476487643178326662161200510754331030214846068..........

-N, --use-lc-numeric

locale 에 따라서 decimal and thousands separators 문자가 다를 수 있는데 이 옵션을 사용하면 숫자 데이터를 locale 에 따라 해석하여 읽어 들입니다.

https://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html

-o[file], --pretty-print[=file]

코드를 보기 좋게 포멧하여 출력합니다. dedugging 하기 위해 파일을 생성할 때 사용할 수 있습니다. 한가지 참고할 것은 스크립트가 실행이 되면서 결과가 출력된다는 점입니다. 옵션 인수인 파일명은 공백 없이 붙여야 되고 파일명을 제공하지 않을 경우는 awkprof.out 에 저장됩니다.

-O, --optimize

코드 최적화와 관련된 옵션인데 현재는 단순히 constant folding 만 포함됩니다.

-p[file], --profile[=file]

awk 는 profiling 기능도 제공합니다. 포함되는 정보는 execution counts for each statement 와 function call counts for each function 입니다. 옵션 인수인 파일명은 공백 없이 붙여야 되고 파일명을 제공하지 않을 경우는 awkprof.out 에 저장됩니다.

https://www.gnu.org/software/gawk/manual/html_node/Profiling.html

-P, --posix

POSIX mode 로 동작합니다. 다시 말해서 모든 gawk 확장 기능이 disable 됩니다.

-S, --sandbox

system() 함수의 사용, getline, 프린트 함수를 이용한 redirection, 확장 모듈 사용이 금지됩니다. 다시 말해서 입력에 사용되는 데이터 파일 외에는 시스템에 접근하지 못하게 하는 것입니다.