awk에서 변수 사용

참조 원문 : Using Variables With awk
관련 글 : awk 기초, awk를 이용한 검색, 6가지 awk 트릭

  awk는 내장된 변수와 유저 정의 변수를 지원하며 bash 스크립트 같은 것과 달리 사용하기 전에 미리 선언할 필요가 없습니다. 변수의 종류로는 다음의 3가지가 있습니다.

  1. 시스템 변수(=내장 변수)
  2. 일반(Scalar) 변수
  3. 배열 변수


1. 시스템 변수
  시스템 변수는 대문자로 되어 있으므로 대소문자를 주의하여 사용해야 합니다.

NR: 줄 번호(number of input lines)
  NR 변수는 매 레코드를 읽을 때마다 값이 1씩 증가하는 변수입니다.

$ awk ‘{print NR}’ processes 
1
2
3
…생략…
72
73
74


NF: 필드 번호(number of fields)
  각 레코드에는 공백 문자로 구분되는 필드들이 있습니다. 필드의 개수는 레코드에 따라 다를 수 있습니다.

$ awk ‘{print NF}’ processes 
11
12

아래는 각 레코드마다 1,2번째 필드의 내용과 총 필드의 개수를 출력하는 예입니다.

$ awk ‘{print $1,$2,NF}’ /var/log/messages.1 
Jul 24 14
Jul 24 11
Jul 24 8
Jul 24 12


FILENAME: 입력 파일 이름(name of input file)
  현재 처리 중인 파일의 이름이 담겨 있습니다. 이 변수는 BODY 섹션 이전에는 선언되지 않기 때문에 BEGIN 섹션에서는 사용할 수 없습니다.

FNR: 입력 파일들 중 현재 사용 중인 파일(used with multiple input files)
  NR과 마찬가지로 줄(레코드)번호를 뜻하지만 NR이 모든 입력 스트림을 통틀어 계산한 줄번호를 출력하는 것과 달리 FNR은 현재 처리 중인 파일 내의 줄번호를 출력합니다.

FS: 필드 구분 문자(field separator character)
  기본적으로 필드는 공백이나 탭으로 구분하지만 “-F” 옵션 뒤에 문자를 적어 해당 문자를 필드 구분 문자로 사용할 수 있습니다. 아래는 ‘:’ 문자로 필드를 구분하는 /etc/passwd 파일에서 ‘jane’이라는 문자열을 찾아 첫 번째 필드와 네 번째 필드를 출력하는 예입니다.

$ tail /etc/passwd | awk -F: ‘/jane/{print $1, “Group: “$4}’
jane Group: 502

구분 문자를 여러 개 사용하고 싶다면 정규식을 사용하여 목적을 달성할 수 있습니다. 아래는 공백, 콜론, 탭을 구분 문자로 사용한 모습입니다. 참고로 이스케이프 문자가 하나 있으므로(\t) 싱글 쿼트가 필요합니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1, “Group: “$4}’


OFS: 출력용 필드 구분 문자(output field separator)
  출력에 사용하는 필드 구분 문자는 기본적으로 공백입니다. 아래처럼 각 필드 사이에 콤마를 사용하면 출력용 필드 구분 문자인 공백이 출력됩니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1,$2,$3,$4,$6,$7}’
jane x 502 502 /home/jane /bin/bash

만약 콤마를 쓰지 않는다면 아래처럼 더덕더덕 붙여서 나옵니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1$2$3$4$6$7}’
janex502502/home/jane/bin/bash


ORS: 출력용 레코드 구분 문자(output record separator)
  각 줄은 하나의 레코드로 취급하며 각 줄의 끝마다 레코드가 끝나는 것으로 취급합니다. 레코드 구분 문자(줄 구분 문자)는 줄 바꿈(new line)을 기본으로 사용합니다.

OFMT: 숫자 출력을 위한 서식(format for numeric output)
  이 변수를 통해 숫자의 서식을 제어할 수 있습니다. 기본 서식은 “%.6g”로 소수점 이하 6자리 수까지 표시합니다.

RS: 레코드 구분 문자(record separator)
  기본적으로 레코드 구분 문자는 줄 바꿈(new line)이다.

$0 변수
  파일 전체를 의미합니다.

$ awk ‘{print $0}’ processes 
USER       PID %CPU %MEM    VSZ RSS TTY STAT START TIME COMMAND
root         1  0.0  0.1  10348 720 ?   Ss   22:01 0:01 init [3]
root         2  0.0  0.0      0   0 ?   S<   22:01 0:00 [migration/0]
root         3  0.0  0.0      0   0 ?   SN   22:01 0:00 [ksoftirqd/0]
root         4  0.0  0.0      0   0 ?   S<   22:01 0:00 [watchdog/0]


2. 일반 변수
  숫자나 문자를 담는 변수입니다.

var=3 또는 var=”test_string”


3. 배열 변수
  변수의 이름과 함께 숫자가 있는 대괄호의 조합으로 사용합니다.

variable_name[0]
variable_name[1]