CodeGym /행동 /Docker SELF /`awk`를 사용한 데이터 포맷팅

`awk`를 사용한 데이터 포맷팅

Docker SELF
레벨 8 , 레슨 2
사용 가능

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. 출력 포맷팅

awkprintf 함수를 사용하여 강력한 포맷팅 출력 지원해. 이건 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

이 명령어가 하는 일:

  1. cat /var/log/syslog — 파일 내용을 읽는다.
  2. awk '{print $5}' — 다섯 번째 열(프로세스 이름)을 추출한다.
  3. sort — 알파벳 순으로 정렬한다.
  4. uniq -c — 고유한 문자열의 개수를 센다.
  5. sort -nr — 숫자값 기준 내림차순으로 정렬한다.
  6. 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 공식 문서를 참고해봐. 이제 데이터를 더 유연하게 다룰 수 있는 법을 확실히 알게 되었을 거야!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION