Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

awk는 입력을 레코드와 필드로 나누어 조건에 맞는 값을 출력하거나 계산합니다. 열 추출, 로그 집계, 간단한 보고서 작성에 유용합니다.

awk 명령어란?

기본 레코드는 한 줄이고, 기본 필드 구분은 연속된 공백 문자입니다. 현재 행 전체는 $0, 첫 필드는 $1, 필드 수는 NF, 누적 행 번호는 NR로 참조합니다. 입력에 따라 -F로 구분자를 지정하세요.

기본 문법

awk [옵션] '패턴 { 동작 }' [파일 ...]

설치된 구현과 옵션은 배포판에 따라 다를 수 있습니다. man awk으로 현재 시스템의 설명을 확인하세요.

사용 예제

두 번째 필드 출력

공백으로 구분된 행에서 원하는 필드만 고릅니다.

awk '{ print $2 }' report.txt

조건에 맞는 행

세 번째 필드가 100보다 큰 행만 출력합니다.

awk '$3 > 100 { print $1, $3 }' report.txt

합계 계산

각 행의 두 번째 필드를 더한 뒤 입력이 끝나면 출력합니다.

awk '{ total += $2 } END { print total }' amounts.txt

필드 조건으로 행 고르기

awk는 기본적으로 연속된 공백을 필드 구분자로 해석합니다. $2는 두 번째 필드이고, 조건이 참인 행에서 $1을 출력할 수 있습니다.

printf 'Ana 12\nBob 7\n' | awk '$2 >= 10 {print $1}'

예시 출력:

Ana

두 번째 행의 값 7은 조건을 만족하지 않아 빠집니다. 열이 탭이나 콜론 등 특정 문자로 구분되어 있다면 -F로 구분자를 지정하세요. 공백이 포함된 CSV 인용 필드나 복잡한 이스케이프까지 처리하려면 CSV 전용 파서를 사용하는 편이 안전합니다.

합계 같은 집계는 행마다 상태를 누적하고 마지막에 출력합니다. 예를 들어 awk '{sum += $2} END {print sum}' 파일은 두 번째 필드의 합을 구합니다. 입력이 숫자가 아닌 문자열이면 기대와 다른 결과가 날 수 있으므로 데이터 형식과 누락된 필드를 먼저 검사하세요.

주요 옵션과 형식

옵션·형식 설명
-F 구분자 입력 필드 구분자를 지정합니다.
-v 이름=값 awk 변수의 초기값을 전달합니다.
BEGIN 첫 입력 행을 읽기 전에 실행하는 패턴입니다.
END 마지막 입력 행을 처리한 뒤 실행하는 패턴입니다.

사용할 때 주의할 점

awk -F,는 인용부호 안에 쉼표가 들어간 CSV를 제대로 파싱하지 못합니다. 입력이 CSV라면 전용 파서를 사용하세요. GNU gawk 전용 기능은 다른 awk 구현에서 동작하지 않을 수 있습니다.

자주 묻는 질문

awk의 $0과 $1은 무엇이 다른가요?

$0은 현재 레코드 전체, $1은 첫 번째 필드입니다.

공식 문서

옵션의 정확한 동작과 구현별 차이는 awk 관련 공식 문서에서 확인할 수 있습니다.

같은 카테고리의 다른 글
Linux / 리눅스 디렉토리 구조와 주요 디렉토리별 용도

Linux / 리눅스 디렉토리 구조와 주요 디렉토리별 용도

리눅스의 /etc, /var, /usr, /home, /proc, /dev 등 주요 디렉토리별 용도와 이름의 의미를 정리합니다. 리눅스 파일시스템 구조를 처음 배우거나 서버 관리에 필요한 디렉토리를 확인할 때 참고할 수 있습니다.

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

diff와 cmp로 두 파일의 차이를 확인하고 unified diff를 읽는 법을 익힙니다. 내용이 다른 경우와 명령 실행 오류의 종료 상태도 구별합니다.

Linux 강좌 / 셸의 명령 실행 방식 - ;, &&, ||, 별칭과 환경 변수

Linux 강좌 / 셸의 명령 실행 방식 - ;, &&, ||, 별칭과 환경 변수

Bash가 명령을 해석하고 종료 상태에 따라 다음 명령을 실행하는 방식을 알아봅니다. ;, &&, ||와 별칭·환경 변수의 차이를 안전한 예제로 설명합니다.

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux lscpu 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / scp - SSH로 로컬·원격 파일 복사

Linux / 명령어 / scp - SSH로 로컬·원격 파일 복사

Linux scp 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux install 명령어로 파일을 복사하면서 권한, 소유자와 대상 디렉터리를 설정하는 방법을 설명합니다. cp와의 차이와 배포 스크립트에서의 활용법도 알아봅니다.

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

find와 locate로 파일을 찾고 which, whereis, type으로 명령의 위치와 해석 방식을 확인합니다. 실시간 검색과 색인 검색의 차이도 짚습니다.

Linux / 명령어 / apropos - 설명 키워드로 명령어 검색

Linux / 명령어 / apropos - 설명 키워드로 명령어 검색

apropos 명령어로 이름을 모르는 리눅스 명령과 매뉴얼을 기능 키워드로 찾는 방법을 설명합니다. 정규 표현식, 모든 키워드 일치, 섹션 제한과 검색 결과가 없을 때의 해결 방법을 다룹니다.

Linux / 명령어 / uname - 커널과 시스템 아키텍처 확인

Linux / 명령어 / uname - 커널과 시스템 아키텍처 확인

Linux uname 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux 강좌 / APT와 DNF로 패키지 설치·업데이트하기

Linux 강좌 / APT와 DNF로 패키지 설치·업데이트하기

Debian·Ubuntu의 APT와 Rocky Linux의 DNF로 패키지를 검색·설치·업데이트·제거하는 방법을 비교합니다. 저장소와 의존성, 업데이트 전 확인할 항목을 다룹니다.