예제로 배우는 AWK/명령행 인자 사용하기

위키책, 위키책

명령행 인자란?[+/-]

명령행 인자란 명령어 뒤에 나열되는 인자들을 의미합니다. 명령어와 인자라는 말을 좀 더 쉽게 이해하기 위해 예제를 살펴보겠습니다. 아래는 1부터 100까지의 합을 구하는 awk 프로그램의 소스입니다.

BEGIN{
	total = 0;

	for(i= 1 ; i <= 100; i++) {
		total = total + i;
	}
	print total;
}

이 프로그램의 이름을 sum.awk 라 저장하고 실행시키면 다음과 같은 결과가 나오게 됩니다.:

 $ gawk -f sum.awk
 5050

위에서 sum.awk에 해당하는 부분이 명령어라고 할 수 있습니다. 우리는 1부터 100까지를 더해서 출력하도록 명령을 준 것입니다. 그런데 이 프로그램은 1부터 100까지의 합을 구할 수는 있지만, 사용자가 임의의 값을 주었을 때 그 범위까지 더하는 기능은 갖고 있지 못합니다. 이러한 것을 프로그램의 일반성이 떨어진다고 말합니다. 사용자는 1부터 100까지뿐만 아니라 2부터 2000까지의 합을 구하고 싶어할 수도 있습니다. 위의 프로그램에서 이를 실행하기 위해서는 소스 코드를 열어서 i의 범위값을 일일이 바꿔줘야 하는 불편함이 생깁니다.

BEGIN{
	total = 0;

	for(i= 2 ; i <= 2000; i++) {
		total = total + i;
	}
	print total;
}

위의 프로그램 소스를 수정해본 것입니다. 이렇게 하면 사용자가 원하는 값을 구할 수 있습니다. 하지만 매번 원하는 값을 프로그램 소스에서 고치면 매우 불편합니다. 사용자는 다음과 같이 간단하게 범위값을 지정해서 계산하고 싶을 수 있습니다.

 $ gawk -f sum.awk 2 2000
 2000999

또는 간단하게 아래와 같이 입력할 수 있으면 좋을 것입니다.

 $ sum 2 2000
 2000999

이 때 sum에 해당하는 부분을 명령어라 하고 사용자가 원하는 입력값 2, 2000과 같은 것을 명령행 인자라고 합니다. 명령행 인자를 사용하는 이유는 위와 같이 프로그램을 일반화함으로써 더 편리하게 사용하기 위해서입니다.

내장변수 ARGV[+/-]

명령행 인자를 사용하기 위해서는 명령행에 입력한 변수를 명령어가 읽어들일 수 있어야 합니다. awk에서는 이러한 기능을 하는 내장변수 ARGV가 존재합니다.

BEGIN {
	print ARGV[1];
}

위와 같은 프로그램을 print.awk라고 저장하고 실행시키면 아래와 같은 결과가 나옵니다

 $ gawk -f print.awk

이처럼 아무런 값이 출력되지 않는 이유는 내장변수 ARGV[1]에 해당하는 입력값을 넣지 않았기 때문입니다. 다음과 같이 해보겠습니다

 $ gawk -f print.awk Hello
 Hello

Hello라는 글자가 출력되었습니다. 이 경우에는 내장변수 ARGV[1]에 입력값 Hello를 넣어줬기 때문입니다. 이상에서 우리는 ARGV[1]가 명령행에서 명령어 다음 칸의 입력값을 가리키고 있음을 알 수 있습니다. 마찬가지로 ARGV[2]는 명령어로부터 다음다음칸의 입력값을 가리킬 것이라 생각할 수 있습니다. ARGV[1]ARGV[2]를 사용하는 프로그램을 만들어 보겠습니다.

BEGIN {
	print ARGV[1], ARGV[2];
}

이 프로그램을 print2.awk라 저장하고 아래와 같이 실행시키면

 $ gawk -f print2.awk Hello World
 Hello World

가 나타납니다. 내장 변수 ARGV[i]는 이처럼 명령어를 기준으로 i번째에 해당하는 명령행 인자를 가리킵니다.

예제[+/-]

내장변수 ARGV를 활용하여 m부터 n까지 값들을 합산하는 일반화된 프로그램을 만들어보겠습니다. 처음 만들었던 프로그램에 약간의 수정만 가하면 됩니다.

BEGIN{
	total = 0;

	for(i= ARGV[1] ; i <= ARGV[2] ; i++) {
		total = total + i;
	}
	print total;
}

앞의 프로그램에서 for문에 있는 i에 1과 100을 직접 입력했는데, 그 부분을 내장변수 ARGV[1], ARGV[2]로 바꿔준 것입니다. 이 프로그램을 sum.awk라 저장하고, 실행을 할 때는 다음과 같은 방식으로 사용할 수 있습니다.

 $ gawk -f sum.awk 1 100
 5050

 $ gawk -f sum.awk 2 2000
 2000999

이처럼 awk에서는 내장변수 ARGV를 사용하여 인자를 직접 넣어주는 프로그램을 만들 수 있습니다. 명령행 인자를 사용하면 일반화된 프로그램들을 편리하게 만들 수 있습니다.