단순히 텍스트를 자르는 cut만으로는 부족함을 느낀 적 없으시나요? "특정 값이 100 이상일 때만 출력하고 싶다"거나 "로그 파일의 특정 열을 모두 더해 합계를 구하고 싶다"는 요구사항이 생기면 우리는 더 강력한 도구를 찾아야 합니다.
오늘 소개할 리눅스 awk 명령어는 텍스트 형태의 데이터를 행과 열로 인식하여 자유자재로 조작하는 '텍스트 분석기'입니다. 15년 차 엔지니어들이 대용량 서버 로그를 단 몇 초 만에 요약할 때 사용하는 awk의 핵심 문법과 실무 팁을 공개합니다.
1. awk 명령어의 기본 구조와 작동 원리
awk는 기본적으로 '패턴(Pattern) { 동작(Action) }'의 구조를 가집니다. 파일의 모든 행을 읽어 들이며 지정한 패턴에 맞는 줄을 찾아 중괄호 안의 명령을 실행합니다.
💡 핵심 개념 - 필드 변수:
- $0: 현재 처리 중인 전체 라인
- $1, $2, ...: 첫 번째, 두 번째 필드 (공백 기준)
- NF: 현재 라인의 필드 개수 (Number of Fields)
- NR: 현재 처리 중인 행 번호 (Number of Records)
2. 바로 써먹는 awk 실무 활용 예제
① 특정 필드 추출 및 포맷팅
가장 기초적인 사용법입니다. 공백으로 구분된 데이터에서 원하는 열만 골라내어 보기 좋게 출력합니다.
# 파일의 1번(이름)과 3번(점수) 필드 출력
$ awk '{ print $1 "의 점수: " $3 }' score.txt
② 조건문 활용 (필터링)
값의 크기를 비교하거나 특정 문자열이 포함된 경우만 처리할 수 있습니다.
# 3번째 필드 값이 80 이상인 행만 전체 출력
$ awk '$3 >= 80 { print $0 }' score.txt
③ 데이터 합계 및 평균 계산
END 블록을 사용하면 모든 행을 처리한 뒤 최종 결과값을 출력할 수 있습니다.
# 3번째 필드(점수)의 전체 합계 구하기
$ awk '{ sum += $3 } END { print "Total: " sum }' score.txt
3. awk 핵심 내장 변수 및 옵션 정리
awk의 기능을 제대로 활용하려면 아래의 내장 변수들을 반드시 숙지해야 합니다.
| 변수/옵션 | 설명 | 활용 예시 |
|---|---|---|
| -F | 입력 구분자(Delimiter) 지정 | -F ':' (CSV/Passwd) |
| NR | 현재까지 읽은 레코드(행) 번호 | 파일의 10번째 줄만 출력 |
| NF | 현재 행의 필드(열) 개수 | 비어있는 행 제외 시 활용 |
| OFS | 출력 시 필드 사이의 구분자 설정 | 탭이나 쉼표로 결과 출력 |
| BEGIN / END | 파일 처리 전/후 실행될 코드 블록 | 헤더 추가 및 최종 합계 산출 |
📢 결론: awk로 데이터 처리의 급을 높이세요
awk는 처음 접하면 생소해 보일 수 있지만, 한 번 익혀두면 엑셀조차 열기 귀찮을 정도로 강력한 데이터 처리 능력을 제공합니다. 특히 대용량 로그 파일에서 특정 조건의 데이터만 추출하고 통계를 내는 작업에는 이만한 도구가 없습니다.
실습 과제: ls -l | awk '{ print $9, $5 }'를 입력하여 현재 디렉토리의 파일 이름과 크기만 깔끔하게 뽑아보세요!