Journey to Security/리눅스

awk - 필드 단위 텍스트 처리 도구

Cordilog 2026. 6. 18. 19:43

1. awk란?

awk는 유닉스/리눅스 환경에서 텍스트 데이터를 처리하기 위한 프로그래밍 언어이자 명령어 도구이다.

이름은 세 명의 개발자 Aho, Weinberger, Kernighan의 이니셜에서 유래했다.

awk는 입력을 한 줄(레코드)씩 읽어 들이고, 각 줄을 필드 단위로 분리한 뒤, 지정된 패턴에 매칭되는 줄에 대해 액션을 수행하는 구조로 동작한다.

 

grep이 검색에 특화되어 있고, sed가 치환에 특화되어 있다면, awk는 필드 단위 데이터 가공에 특화되어 있다.

로그 분석, 시스템 모니터링 스크립트, 텍스트 리포트 생성 등 실무에서 가장 빈번하게 사용되는 도구 중 하나이다.

먼저 awk가 입력 데이터를 어떻게 해석하는지 구조를 살펴보자.

 

awk는 입력을 레코드(줄) 단위로 읽고, 각 레코드를 필드 단위로 쪼갠다.

$0은 레코드 전체, $1, $2...는 개별 필드, $NF는 마지막 필드를 의미한다.

기본 필드 구분자(FS)는 공백과 탭이다.

 

2. awk의 3가지 기본 형식

awk 지시는 패턴, 액션, 패턴 + 액션 이렇게 3가지 형식으로 구성된다.

1️⃣ 패턴만 사용하는 경우

패턴에 매칭되는 줄 전체를 출력한다. grep과 유사한 동작이다.

awk '/root/' /etc/passwd

이 명령은 /etc/passwd 파일에서 root라는 문자열이 포함된 줄을 출력한다.

액션을 생략하면 기본 액션인 {print $0}(줄 전체 출력)이 적용된다.

 

2️⃣ 액션만 사용하는 경우

패턴을 생략하면 모든 줄에 대해 액션이 수행된다.

awk '{print $1}' /etc/passwd

모든 줄의 첫 번째 필드를 출력한다.

다만 /etc/passwd는 :로 구분되어 있으므로, 기본 구분자(공백)로는 원하는 결과가 나오지 않는다.

이 경우 -F 옵션이 필요하다(뒤에서 설명).

 

3️⃣ 패턴 + 액션을 함께 사용하는 경우

패턴에 매칭되는 줄에 대해서만 액션을 수행한다. 이것이 awk의 가장 많이 사용되는 형태이다.

awk '/root/ {print $1, $3}' /etc/passwd

root가 포함된 줄에서 첫 번째와 세 번째 필드만 출력한다.

정리하면 다음과 같다.

형식 문법 동작
패턴만 awk 'pattern' 파일 매칭 줄 전체 출력
액션만 awk '{action}' 파일 모든 줄에 액션 수행
패턴+액션 awk 'pattern {action}' 파일 매칭 줄에만 액션 수행

 

3. awk 사용 방법

awk는 입력 소스에 따라 크게 두 가지 방법으로 사용할 수 있다.

1️⃣ 키보드(표준입력)로부터 입력을 받는 경우

파일명을 지정하지 않으면 awk는 표준입력(stdin)에서 데이터를 읽는다.

터미널에서 직접 타이핑하거나, 파이프를 통해 다른 명령의 출력을 전달받을 수 있다.

 

🔵 직접 stdin으로 입력하는 방식

$ awk '{print $2}'
hello world linux         ← 사용자가 입력
world                     ← awk가 두 번째 필드 출력
this is awk test          ← 사용자가 입력
is                        ← awk가 두 번째 필드 출력
(Ctrl+D로 종료)

🔵 파이프를 통해 입력받는 방식

$ echo "192.168.1.1  web-server  running" | awk '{print $2}'
web-server
 

실무에서는 거의 대부분 파이프(|)를 통해 다른 명령의 출력 결과를 awk로 전달하는 방식으로 사용한다.

 

2️⃣ 파일로부터 입력을 받는 경우

명령 뒤에 파일 경로를 직접 지정한다.

awk '{print $1, $3}' /etc/passwd

이 방식에서는 awk가 파일을 열어 한 줄씩 읽으며 처리한다.

 

4. 구분자 변경 옵션: -F

awk의 기본 필드 구분자(Field Separator)는 공백(space)과 탭(tab)이다.

그러나 /etc/passwd처럼 :로 구분된 파일이나, CSV처럼 ,로 구분된 파일을 처리할 때는 -F 옵션으로 구분자를 변경해야 한다.

1️⃣ 기본 문법

awk -F'구분자' '{action}' 파일명

2️⃣ 사용 예시

🔵 /etc/passwd에서 사용자명과 홈 디렉토리 추출

$ awk -F':' '{print $1, $6}' /etc/passwd
root /root
bin /bin
daemon /sbin
...
 

/etc/passwd는 :으로 7개 필드가 구분되어 있다.

-F':'를 지정하면 $1이 사용자명, $6이 홈 디렉토리가 된다.

 

🔵 CSV 파일 처리

$ awk -F',' '{print $1, $3}' data.csv
 

🔵 다중 구분자 지정

$ awk -F'[:/]' '{print $1}' /etc/passwd
대괄호로 여러 문자를 동시에 구분자로 사용할 수 있다.
위 예시는 :/ 두 가지를 모두 구분자로 인식한다.

 

5. 실전 예제: 쉘 스크립트에서 sed + awk 조합

실무에서 awk는 단독으로 사용하기보다 ps, grep, sed 등 다른 명령어와 파이프로 연결하여 조합하는 경우가 많다.

대표적인 예시로, 특정 프로세스의 PID를 추출하여 변수에 저장하는 패턴을 살펴보자.

1️⃣ 시나리오

웹 서버(httpd) 프로세스의 PID를 검색하여 webserver라는 쉘 변수에 저장하려 한다.

2️⃣ 명령어 구성

webserver=$(ps -ef | grep httpd | grep -v grep | sed -n '1p' | awk '{print $2}')

이 명령을 단계별로 분해하면 다음과 같다.

 

 

🔵 ps -ef : 시스템의 전체 프로세스 목록을 출력한다. -e는 모든 프로세스, -f는 풀 포맷을 의미한다.

🔵 grep httpd : 출력 결과 중 httpd 문자열이 포함된 줄만 필터링한다.

🔵 grep -v grep : grep httpd를 실행하면 grep 명령 자체도 프로세스로 잡히기 때문에, -v 옵션으로 grep이 포함된 줄을 제외한다. 이것은 프로세스 검색 시 반드시 기억해야 할 패턴이다.

🔵 sed -n '1p' : httpd 프로세스가 여러 개 있을 수 있으므로, 첫 번째 줄만 선택한다. -n은 자동 출력을 억제하고, 1p는 1번째 줄만 출력하라는 의미이다.

🔵 awk '{print $2}' : ps -ef 출력에서 두 번째 필드가 PID이므로, $2로 PID만 추출한다.

🔵 $( ) : 전체 파이프라인의 결과를 명령 치환(Command Substitution)을 통해 webserver 변수에 저장한다.

 

3️⃣ 결과 확인

$ echo $webserver
1234

이제 $webserver 변수에 저장된 PID를 활용하여 프로세스 제어(kill, 모니터링 등)를 수행할 수 있다.

# 예: 해당 프로세스 강제 종료
kill -9 $webserver

6. awk 주요 내장 변수 정리

awk 명령과 함께 자주 사용하는 내장 변수는 다음과 같다.

변수 의미 기본값
$0 현재 레코드(줄) 전체 -
$1, $2, ... 1번째, 2번째, ... 필드 -
NF 현재 레코드의 필드 개수 -
NR 현재까지 처리한 레코드 번호 -
FS 입력 필드 구분자 공백/탭
OFS 출력 필드 구분자 공백
RS 입력 레코드 구분자 개행문자(\n)
$NF 마지막 필드 -

활용 예시:

# 각 줄의 필드 개수와 함께 출력
awk '{print NR, NF, $0}' /etc/passwd

# 마지막 필드만 출력
awk -F':' '{print $NF}' /etc/passwd

7. 정리

  • awk의 3가지 사용 형식: 패턴, 액션, 패턴+액션
  • 입력 방식: 키보드(stdin) 또는 파일
  • -F 옵션으로 구분자를 변경 가능
  • $1, $2, $NF 등 필드 변수로 원하는 데이터만 정밀 추출
  • sed, grep, ps 등과 파이프라인으로 조합하여 시스템 관리 스크립트 구성 가능