awk, Linux command 총정리
AWK는 강력한 텍스트 프로세싱 도구로, 시스템 관리자, 개발자, 데이터 분석가 등 다양한 분야에서 널리 사용됩니다. 이 문서에서는 AWK의 역사, 기본 문법, 옵션, 실전 예제까지 모두 다룹니다.
1. AWK의 역사
1.1. AWK란 무엇인가?
AWK는 텍스트 데이터를 검색, 변환, 분석, 출력하는 데 특화된 프로그래밍 언어입니다. 리눅스 및 유닉스 환경에서 흔히 사용되며, 로그 분석, CSV 파일 처리, 데이터 필터링, 시스템 자동화 등에 매우 유용합니다.
AWK는 단순한 명령어가 아니라, 강력한 프로그래밍 언어로 볼 수도 있습니다. 변수, 배열, 함수, 제어문(조건문, 반복문)까지 활용할 수 있어 간단한 데이터 처리부터 복잡한 자동화 스크립트까지 작성이 가능합니다.
1.2. AWK의 역사
AWK는 1977년, 벨 연구소(Bell Labs)에서 Alfred Aho, Peter Weinberger, Brian Kernighan이 개발하였습니다. 이들의 이름을 따서 AWK라는 이름이 붙여졌습니다.
개발 당시 AWK는 UNIX 환경에서 데이터를 쉽게 가공하고 분석하는 것을 목표로 했으며, C 언어 기반으로 작성되었습니다. 이후 UNIX 시스템에서 필수적인 도구로 자리 잡았고, 다양한 변형 버전이 등장했습니다.
주요 AWK 변형 버전:
- GNU AWK(gawk): 가장 널리 사용되는 AWK의 구현체로, 확장 기능이 많음.
- MAWK: 속도가 빠르며, 경량화된 AWK 버전.
- NAWK: New AWK, 기존 AWK보다 성능 개선됨.
AWK는 오늘날 데이터 분석 및 시스템 자동화에서 필수적인 역할을 하고 있으며, 빅데이터 처리, 대용량 로그 분석, 네트워크 모니터링, 서버 상태 검사 등의 다양한 실무 환경에서 사용됩니다.
1.3. AWK의 주요 특징
AWK는 다음과 같은 강력한 기능을 제공합니다:
- 행(row)과 필드(field) 단위로 데이터 처리
- 정규 표현식 지원으로 강력한 패턴 매칭 가능
- 변수, 배열, 함수 사용 가능
- 자동 반복 구조 (라인을 한 줄씩 읽어서 실행)
- CSV, TSV, 로그 파일 처리에 최적화
- BEGIN, END 블록을 통한 초기화 및 최종 처리 지원
- 쉘 스크립트와 결합하여 자동화 가능
- 파이프라인을 통해 다른 명령어와 함께 사용 가능
- AWK 스크립트 파일을 생성하여 단독 실행 가능
2. AWK의 기본 문법
AWK의 기본 구조는 다음과 같습니다:
awk '패턴 { 액션 }' 파일명
awk '{print $1, $3}' data.txt
- $1: 첫 번째 필드
- $3: 세 번째 필드
- data.txt 파일에서 1번째, 3번째 필드 출력
2.1. 필드와 레코드
AWK는 기본적으로 파일을 줄 단위(레코드)로 읽고, 공백이나 지정된 구분자를 기준으로 필드 단위로 나눕니다.
변수 | 설명 |
$0 | 현재 행 전체 |
$1, $2, ... | 해당 필드 값 (첫 번째, 두 번째 등) |
NR | 현재 줄 번호 (Number of Record) |
NF | 현재 행의 필드 개수 (Number of Fields) |
FS | 입력 필드 구분자 (기본값: 공백) |
OFS | 출력 필드 구분자 |
RS | 입력 레코드 구분자 (기본값: 개행) |
ORS | 출력 레코드 구분자 |
예제 1: 줄 번호와 특정 필드 출력
awk '{print NR, $1, $3}' data.txt
2.2. BEGIN, BODY, END 블록
AWK는 실행 단계에 따라 BEGIN, BODY, END 블록을 지원합니다.
awk 'BEGIN {print "Header"} {print $1, $2} END {print "Footer"}' file.txt
- BEGIN: 파일 처리 전 실행 (초기 설정, 출력 형식 지정)
- {} (BODY): 각 행이 처리될 때 실행
- END: 모든 입력 처리가 끝난 후 실행
2.3. 조건문과 반복문
2.3.1. 조건문 (if 문 사용)
awk '{if ($3 > 100) print $1, $3}' sales.txt # 세 번째 필드가 100보다 크면 출력
2.3.2. 반복문 (for 문 사용)
awk '{for (i=1; i<=NF; i++) print $i}' data.txt # 모든 필드 개별 출력
2.4. 내장 함수
AWK는 여러 유용한 내장 함수를 제공합니다. 여기서는 문자열, 수학, 시간 관련 함수들을 정리합니다.
2.4.1. 문자열 함수
함수 | 설명 |
length($0) | 현재 행의 길이 반환 |
toupper($1) | 첫 번째 필드를 대문자로 변환 |
tolower($2) | 두 번째 필드를 소문자로 변환 |
substr($3, 1, 5) | 세 번째 필드의 처음 5글자 반환 |
index($1, "test") | 첫 번째 필드에서 "test" 문자열의 위치 반환 |
2.4.2. 수학 함수
함수 | 설명 |
int($1) | 첫 번째 필드를 정수로 변환 |
sqrt($2) | 두 번째 필드의 제곱근 반환 |
rand() | 0~1 범위의 난수 생성 |
srand() | 난수 생성기의 시드값 설정 |
2.4.3. 시간 함수
함수 | 설명 |
systime() | 현재 시간을 UNIX 타임스탬프로 반환 |
strftime("%Y-%m-%d %H:%M:%S", systime()) | 현재 시간을 포맷된 문자열로 반환 |
3. AWK의 주요 옵션
3.1. 주요 옵션
옵션 | 설명 |
-F | 필드 구분자 지정 (예: -F, CSV 파일 처리) |
-v | 변수 선언 (예: -v var=10) |
-f | AWK 스크립트 파일 실행 (예: -f script.awk) |
-W | 특정한 환경 설정 옵션 지정 |
-n | 자동으로 줄을 읽지 않도록 설정 |
-t | 출력 시 탭을 구분자로 설정 |
awk -F, '{print $1, $3}' data.csv # 콤마(,)를 구분자로 사용
awk -v name=John '$1 == name {print}' users.txt # name 변수를 사용한 필터링
AWK의 다양한 옵션을 조합하면 더욱 강력한 데이터 처리가 가능합니다.
3. 실전 예제
3.1. 로그 파일에서 특정 패턴 추출
awk '/ERROR/ {print $0}' system.log # ERROR가 포함된 줄만 출력
3.2. CSV 파일에서 특정 조건에 맞는 데이터 추출
awk -F, '$3 > 50 {print $1, $3}' data.csv # 3번째 열이 50보다 큰 경우 출력
3.3. 웹 서버 로그 분석 (IP별 접속 횟수 카운트)
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log
3.4. 대량의 데이터 합산 및 평균 계산
awk '{sum += $2; count++} END {print "Average:", sum/count}' numbers.txt
3.5. 특정 열 기준으로 정렬된 데이터 출력
awk '{print $2, $1}' data.txt | sort
3.6. 특정 필드 값 변경 후 저장
awk '{$2 = "UPDATED"; print}' input.txt > output.txt
3.7. 데이터 필터링 및 컬럼 재구성
awk -F: '{print "User: "$1, "Home Directory: "$6}' /etc/passwd
3.8. 다중 파일 처리 (파일명과 함께 내용 출력)
awk '{print FILENAME, $0}' *.log
AWK는 강력한 데이터 처리 명령어입니다. 패턴 매칭과 필터링, 데이터 변환을 효과적으로 수행할 수 있으며, 대량의 로그나 CSV 파일을 다룰 때 탁월한 성능과 간결한 문법을 제공합니다.
기본적인 AWK 문법만 익혀도 다양한 데이터 분석과 자동화 작업에 활용할 수 있으니, 이제 AWK를 자유롭게 활용하여, 더욱 효율적인 데이터 처리를 해보시기 바랍니다.