iBetter Books
수정

awk 기본 구조

awk의 이름은 개발자 세 명의 이름 첫 글자를 딴 것입니다. Aho, Weinberger, Kernighan. 1977년에 만들어졌지만 지금도 리눅스 시스템 관리와 데이터 처리 현장에서 매일 쓰입니다. 오랫동안 살아남은 도구에는 이유가 있습니다.

기본 문법

awk '패턴 { 액션 }' 파일

awk는 파일을 한 줄씩 읽으면서 패턴을 검사합니다. 패턴이 맞으면 액션을 실행합니다. 패턴을 생략하면 모든 줄에 액션을 실행합니다. 액션을 생략하면 패턴이 일치하는 줄을 그대로 출력합니다.

# 모든 줄 출력 (패턴 생략)awk '{ print }' /etc/passwd# "root"가 포함된 줄만 출력 (액션 생략)awk '/root/' /etc/passwd

BEGIN과 END 블록

BEGIN은 첫 번째 줄을 읽기 전에 한 번 실행됩니다. END는 마지막 줄을 처리한 후에 한 번 실행됩니다. 헤더 출력, 초기화, 합계 출력에 사용합니다.

awk 'BEGIN { print "시작" } { print NR, $0 } END { print "끝" }' /tmp/sample.txt
시작
1 apple
2 banana
3 cherry
4 date
5 elderberry
6 fig
7 grape
끝

NR은 현재 줄 번호를 저장하는 내장 변수입니다. $0은 현재 줄 전체를 의미합니다.

필드 변수

awk는 각 줄을 공백(기본값)으로 나누어 필드를 만듭니다.

변수 의미
$0 줄 전체
$1 첫 번째 필드
$2 두 번째 필드
$NF 마지막 필드 (NF = 필드 수)
echo "Alice 30 Seoul" | awk '{ print $1, $3 }'
Alice Seoul

$NF는 필드 수(NF)를 인덱스로 사용하므로 항상 마지막 필드를 가리킵니다.

echo "one two three four five" | awk '{ print $NF }'
five

-F 옵션: 구분자 지정

기본 구분자는 공백입니다. -F 옵션으로 다른 구분자를 지정합니다.

# /etc/passwd는 콜론으로 구분awk -F: '{ print $1, $7 }' /etc/passwd | head -5
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync

첫 번째 필드는 사용자 이름, 일곱 번째 필드는 기본 쉘입니다.

CSV 파일도 동일하게 처리합니다.

cat > /tmp/scores.csv << 'EOF'이름,국어,영어,수학Alice,85,92,88Bob,72,68,80Carol,95,89,91Dave,60,74,65EOF# 이름과 수학 점수만 출력 (첫 번째 줄 헤더 제외)awk -F, 'NR > 1 { print $1, $4 }' /tmp/scores.csv
Alice 88
Bob 80
Carol 91
Dave 65

NR > 1은 2번째 줄부터 처리한다는 의미입니다. 헤더 줄을 건너뜁니다.

실습 1. /etc/passwd에서 사용자명과 쉘 출력

# 사용자명:쉘 형식으로 출력awk -F: '{ print $1 ":" $7 }' /etc/passwd | head -5
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync

문자열 연결은 공백 없이 나란히 놓습니다. $1 ":" $7은 사용자명, 콜론, 쉘을 이어 붙입니다.

실습 2. 로그인 가능한 사용자만 출력

# /bin/bash 쉘을 사용하는 사용자만awk -F: '$7 == "/bin/bash" { print $1 }' /etc/passwd
root
jeongps

$7 == "/bin/bash"가 패턴입니다. 조건이 참인 줄만 액션을 실행합니다.

실습 3. 총 줄 수 세기

# wc -l과 동일한 동작awk 'END { print NR }' /etc/passwd
42

END 블록에서 NR은 마지막으로 처리한 줄 번호, 즉 전체 줄 수입니다.

awk의 기본 구조를 파악했습니다. 다음 절에서는 내장 변수와 출력 포맷을 더 깊이 살펴보겠습니다.