본문 바로가기
OS 운영체제/LINUX

awk (텍스트 조작 명령어)

by yororing 2024. 9. 20.

00 개요

 

01 awk란

1. 정의

  • Aho, Weinberger, Kernighan이 만든 프로그래밍 언어 및 명령어
  • 텍스트 파일이나 명령의 출력에서 데이터를 추출하고, 필터링하고, 조작하는 데 유용
  • 주로 로그 파일 분석, 데이터 처리, 텍스트 변환 등의 작업에 활용

2. 문법

awk '패턴 { 액션 }' 파일명
awk '패턴 { 액션 }'
  • 패턴: awk가 처리할 라인의 조건
  • 액션: 패턴이 일치하는 라인에 대해 수행할 작업
  • 파일명: 데이터를 처리할 파일

3. 예시

  • sample.txt라는 파일에서 특정 조건에 맞는 행을 출력하기
awk '$3 > 50 { print $1, $3 }' sample.txt
  • 반환값: 파일에서 세 번째 필드의 값이 50보다 큰 행을 찾아 첫 번째와 세 번째 필드를 출력

4. 기능

1) 필드 구분

  • awk는 기본적으로 공백이나 탭 문자를 기준으로 데이터를 필드로 구분
  • 각 필드는 $1, $2, ... $n으로 참조 가능
  • 예시
awk '{print $0}' 'sample.txt' # 모든 내용 출력
STR     LEN_STR  SPEAKER
Hello   5        Pearl
Hi      2        Jake
What?   5        Cathy
Nothing 7        Judy

awk '{print $1}' 'sample.txt' # 첫 번째 필드 출력
STR
Hello
Hi
What?
Nothing

awk '{print $2}' 'sample.txt' # 두 번째 필드 출력
LEN_STR
5
2
5
7
  • 예시
echo "김민지 28 개발자" | awk '{print $1, $3}'
  • 위의 명령은 "김민지 개발자"를 출력함
  • $1은 첫 번째 필드인 "김민지"
  • $3은 세 번째 필드인 "개발자"

2) 필드 구분자 변경

  • 필드 구분자 -F 옵션을 사용하여 변경 가능
  • 예시: 콤마(,)로 구분된 CSV 파일 처리 시 다음과 같이 구분자 지정 가능
awk -F, '{print $1, $2}' data.csv
  • 위의 명령은 콤마로 구분된 data.csv 파일에서 첫 번째와 두 번째 필드 출력

3) 조건부 처리

  • 조건부로 특정 라인에 대해서만 작업 수행 가능
  • 예시: 두 번째 열의 값이 100보다 큰 행만 출력하기
awk '$2 > 100 {print $0}' data.txt
  • 위의 명령은 두 번째 필드의 값이 100보다 큰 모든 행 출력
  • $0은 전체 행

4) 내장 변수

  • NR (number of records): 현재 처리 중인 행 번호
  • NF (number of fields): 현재 행의 필드 개수
  • FS (field seperator): 필드 구분자 (기본값 = 공백)
  • OFS (output field seperator): 출력 필드 구분자 (기본값 = 공백)
  • RS (record seperator): 레코드 구분자 (기본값 = 개행)
  • 예시: NR 사용하여 파일의 n 번째 줄만 출력하기
# 첫 번째 줄만 출력
awk 'NR == 1 {print $0}' sample.txt

# 두 번쨰 줄만 출력
awk 'NR ==2 {print $0}' sample.txt

5) BEGIN과 END 블록

  • BEGIN과 END 블록은 각각 입력 처리 전과 후에 특정 작업 수행 가능하게 함
  • 예시: 파일의 모든 행을 출력하면서, 처음과 끝에 메세지 추가하기
awk 'BEGIN {print "시작합니다"} {print $0} END {print "끝났습니다"}' sample.txt

5. 활용

1) 특정 필드 합계 구하기

  • 예시: 두 번째 필드의 합계 구하기
awk '{print $0}' 'sample.txt' # 모든 내용 출력
STR     LEN_STR  SPEAKER
Hello   5        Pearl
Hi      2        Jake
What?   5        Cathy
Nothing 7        Judy

awk '{sum += $2} END {print "합계:, sum}' sample.txt	# 2번째 필드의 합계 구하기
합계: 19
  • 위의 명령어는 각 행의 두 번째 필드를 더한 뒤, 마지막에 그 합계를 출력

2) 텍스트 파일에서 특정 패턴 검색

  • /패턴/ 구문을 사용하여 특정 패턴을 포함하는 행 검색 가능
  • 예시: 'error'라는 단어가 포함된 행 출력하기
awk '/error/ {print $0}' logfile.txt
  • 예시; 'th'가 포함된 행 출력하기
awk '{print $0}' 'sample.txt' # 모든 내용 출력
STR     LEN_STR  SPEAKER
Hello   5        Pearl
Hi      2        Jake
What?   5        Cathy
Nothing 7        Judy

awk '/th/ {print $0}' sample.txt	# 'th'가 포함된 행만 출력
What?   5        Cathy
Nothing 7        Judy

3) 필드 값으로 파일 정렬하기

  • sort 명령어와 함께 사용하여 특정 필드를 기준으로 파일 정렬 가능
  • 예시: 두 번째 필드를 기준으로 데이터를 숫자 정렬한 후 출력하
awk '{print $2, $1}' sample.txt | sort -n    # 두 번째 행, 첫 번째 행의 값들을
LEN_STR STR			            #  두 번째 행을 기준으로 숫자 정렬된 내용 출력
2 Hi
5 Hello
5 What?
7 Nothing
  •