awk
를 사용한 데이터 포맷팅
1. awk
와의 첫 만남
awk
는 데이터를 처리하기 위한 강력한 텍스트 유틸리티야. 텍스트 파일을 행(로우)과 열로 이루어진 표로 본다면, 행은 줄이고, 열은 공백으로 구분된 데이터로 보면 돼. awk
는 이런 데이터를 다루는 데에 최고야. 열을 선택하거나, 행을 필터링하거나, 데이터를 형식화하거나, 심지어는 산술 연산까지도 할 수 있어.
이름은 저자들의 이름에서 따온 거야 — Alfred Aho, Peter Weinberger, Brian Kernighan (맞아, C언어를 만든 그 Brian Kernighan!).
awk
의 핵심 개념은 패턴과 액션을 사용한 데이터 처리야. 그 덕분에 일종의 미니 프로그래밍 언어처럼 느껴질 수도 있어.
awk
의 문법
기본적인 명령어 문법은 이렇게 생겼어:
awk '패턴 {동작}' 파일
패턴
— 파일의 각 행에서 검증되는 조건이야.동작
— 패턴에 맞는 행에서 실행되는 작업이야.- 패턴이 없다면, 모든 행에 대해 동작이 실행돼.
예제:
awk '{print $1}' data.txt
이 명령은 파일 data.txt
의 각 줄에서 첫 번째 열($1
)을 출력해.
2. awk
의 주요 기능
1. 열 선택하기
awk
를 사용하는 가장 간단한 방법은 파일에서 하나 이상의 열을 선택하는 거야. 필드는 $n
으로 표시되고, 여기서 n
은 1부터 시작하는 열 번호를 의미해.
예시:
첫 번째와 세 번째 열 출력:
awk '{print $1, $3}' data.txt
예를 들어, data.txt
파일이 이렇게 생겼다고 하자:
John 25 Engineer
Jane 30 Designer
Mike 28 Developer
결과:
John Engineer
Jane Designer
Mike Developer
2. 조건에 따른 행 처리
조건을 사용하면 특정 조건에 맞는 행만 처리할 수 있어.
예시:
두 번째 열의 값이 27보다 큰 행 출력:
awk '$2 > 27 {print $1, $2}' data.txt
결과:
Jane 30
Mike 28
3. 산술 연산
awk
는 산술 연산도 수행할 수 있어. 실시간으로 어떤 계산을 해야 할 때 유용해.
예시:
두 번째 열의 값에 10을 더하기:
awk '{print $1, $2+10}' data.txt
결과:
John 35
Jane 40
Mike 38
4. 행 수 세기
awk
는 자동으로 처리된 행의 수를 알고 있어. 이 정보는 NR
(Number of Records) 변수에 저장돼.
예시:
파일의 행 수 세기:
awk 'END {print NR}' data.txt
결과:
3
3. 확장된 기능
1. 출력 포맷팅
awk
는 printf
함수를 사용하여 강력한 포맷팅 출력 지원해. 이건 C의 printf
함수와 비슷해.
예제:
정렬된 데이터를 출력하기:
awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt
결과:
John 25 Engineer
Jane 30 Designer
Mike 28 Developer
2. 변수
데이터 저장 및 작업 단순화를 위해 변수를 사용할 수 있어.
예제:
두 번째 열의 합계를 계산하기:
awk '{sum += $2} END {print "Total Age:", sum}' data.txt
결과:
Total Age: 83
3. 정규 표현식
awk
는 문자열 검색을 위한 정규 표현식을 지원해.
예제:
첫 번째 열에 J
문자가 있는 행을 출력하기:
awk '/J/ {print $0}' data.txt
결과:
John 25 Engineer
Jane 30 Designer
4. 실습 예제
1. 시스템 로그 분석
예를 들어, 우리가 시스템 로그 파일 /var/log/syslog
을 가지고 있고, 어떤 프로세스가 가장 자주 언급되는지 알고 싶다고 하자.
명령어:
cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10
이 명령어가 하는 일:
cat /var/log/syslog
— 파일 내용을 읽는다.awk '{print $5}'
— 다섯 번째 열(프로세스 이름)을 추출한다.sort
— 알파벳 순으로 정렬한다.uniq -c
— 고유한 문자열의 개수를 센다.sort -nr
— 숫자값 기준 내림차순으로 정렬한다.head -10
— 상위 10개의 프로세스를 출력한다.
2. 급여 보고서 준비
우리에겐 salaries.txt
파일이 있다:
John 25 4000
Jane 30 5000
Mike 28 4500
문제:
급여를 10% 인상하고 최종 보고서를 표시하자.
해결:
awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt
결과:
John 25 4400.00
Jane 30 5500.00
Mike 28 4950.00
5. awk
작업 시 자주 발생하는 오류
구분자 문제
awk
는 기본적으로 공백이나 탭을 구분자로 사용해. 근데 만약 데이터가 다른 걸로(예: 콤마 또는 콜론) 구분되어 있다면, -F
옵션을 이용해서 이를 명시해줘야 해.
예시:
data.csv
파일:
John,25,Engineer
Jane,30,Designer
Mike,28,Developer
CSV 파일에서 작업하는 명령어:
awk -F',' '{print $1, $3}' data.csv
결과:
John Engineer
Jane Designer
Mike Developer
잘못된 형식으로 인한 필드 누락
가끔은 문자열에 의도치 않은 공백이나 누락된 열이 포함될 수 있어. 이런 경우 오류를 일으킬 수 있으니, 작업을 시작하기 전에 데이터를 꼭 확인하는 게 좋아.
실전 활용
방금 awk
를 사용해서 시스템 로그를 분석하고, 급여 데이터를 처리하며, 리포트를 생성하는 방법을 배웠어. 이런 기술은 대형 데이터베이스, CSV 파일, 또는 실제 프로젝트에서의 로그 파일 작업에 정말 유용할 거야. DevOps 분야에서 일하고 있다면 awk
를 사용해서 시스템 로그를 분석하는 게 너의 초능력이 될 거야. 그리고 개발자라면, 터미널에서 데이터를 빠르게 조작할 수 있는 멋진 방법이 될 거야.
awk
를 더 심층적으로 공부하려면 GNU Awk 공식 문서를 참고해봐. 이제 데이터를 더 유연하게 다룰 수 있는 법을 확실히 알게 되었을 거야!
GO TO FULL VERSION