티스토리 뷰

카테고리 없음

Linux awk 명령

빛의기도 2025. 2. 5. 12:22

1. awk란 무엇인가요?

awk는 Aho, Weinberger, Kernighan 세 사람의 성을 따서 만든 이름으로, 텍스트 파일에서 패턴을 검색하고 그에 따른 작업을 수행하는 스크립트 언어이자 명령어입니다. 주로 데이터 처리와 보고서 생성에 사용되며, 다음과 같은 특징을 갖고 있습니다:

패턴 매칭: 정규 표현식을 사용하여 원하는 텍스트를 손쉽게 찾을 수 있습니다.

필드와 레코드 개념: 텍스트를 필드(열)와 레코드(행)로 분할하여 구조화된 데이터처럼 다룰 수 있습니다.

프로그램 가능성: 변수, 배열, 함수, 조건문, 반복문 등 프로그래밍 기능을 제공합니다.

유연성: 간단한 명령에서 복잡한 스크립트까지 다양하게 활용할 수 있습니다.

2. awk의 기본 구문

awk '패턴 { 동작 }' 파일명

패턴: 검사할 조건식 또는 정규 표현식입니다.

동작: 패턴에 매칭되는 레코드에 대해 수행할 명령어 블록입니다.

파일명: 대상이 되는 텍스트 파일입니다.

예를 들어:

awk '/error/ { print $0 }' logfile.txt

logfile.txt에서 'error'라는 단어가 포함된 줄을 찾아 출력합니다.

3. 주요 개념

3.1. 레코드와 필드

레코드(Record): 기본적으로 한 줄의 텍스트를 의미하며, 줄바꿈 문자(\n)로 구분됩니다.

필드(Field): 한 레코드 내에서 필드 구분자(FS)로 분리된 각 부분을 의미합니다. 기본 구분자는 공백(Space)입니다.

$1, $2, ..., $NF: 각각 첫 번째 필드, 두 번째 필드, ..., 마지막 필드를 나타냅니다.

$0: 전체 레코드를 의미합니다.

3.2. 내장 변수

변수 설명
$0 현재 레코드 전체
$1, $2 각 필드의 값
FS 필드 구분자(Field Separator), 기본값은 공백
RS 레코드 구분자(Record Separator), 기본값은 줄바꿈
NF 현재 레코드의 필드 개수
NR 현재까지 처리한 총 레코드 수
FNR 현재 파일에서 처리한 레코드 수
OFS 출력 필드 구분자(Output Field Separator)
ORS 출력 레코드 구분자(Output Record Separator)

4. awk의 기본 사용법

4.1. 모든 레코드 처리

파일의 모든 줄에 대해 동작을 수행합니다.

awk '{ print $0 }' filename

4.2. 특정 패턴에 매칭되는 레코드 처리

awk '/pattern/ { print $0 }' filename

'pattern'에 매칭되는 레코드에만 동작을 수행합니다.

5. 실용적인 예제

예제 1: 특정 필드 출력하기

파일 내용(data.txt):

Alice 30 Developer
Bob 25 Designer
Charlie 35 Manager
  • 첫 번째와 두 번째 필드를 출력하기:
awk '{ print $1, $2 }' data.txt
  • 결과:
Alice 30
Bob 25
Charlie 35

예제 2: 조건에 따른 출력

  • 나이가 30 이상인 사람의 정보 출력:
awk '$2 >= 30 { print $0 }' data.txt
  • 결과:
Alice 30 Developer
Charlie 35 Manager

예제 3: 필드 구분자 변경하기

CSV 파일(data.csv):

Name,Age,Role
Alice,30,Developer
Bob,25,Designer
Charlie,35,Manager
  • 필드 구분자를 콤마로 지정하고, 이름과 역할 출력:
awk -F',' '{ print $1, $3 }' data.csv
  • 결과:
    Name Role
    Alice Developer
    Bob Designer
    Charlie Manager

예제 4: 패턴 매칭

  • 'Developer' 역할을 가진 사람만 출력:
awk '/Developer/ { print $0 }' data.txt
  • 결과:
Alice 30 Developer

6. 수학 연산 및 변수 사용

예제 5: 합계와 평균 계산

점수 파일(scores.txt):

Subject Score
Math 90
Science 80
English 85
  • 점수의 총합과 평균 계산:
awk 'NR > 1 { total += $2 } END { print "Total:", total; print "Average:", total/(NR-1) }' scores.txt
  • 결과:
Total: 255
Average: 85
명령 설명
NR > 1 첫 번째 줄(헤더)을 제외하고 연산합니다.
total += $2 두 번째 필드(점수)를 누적합니다.
END 모든 레코드를 처리한 후 결과를 출력합니다.

7. 제어 구조 사용

예제 6: 조건문(if) 사용

  • 나이에 따라 성인 여부 판별:
awk '{ if ($2 >= 20) status="Adult"; else status="Minor"; print $1, status }' data.txt
  • 결과:
Alice Adult
Bob Adult
Charlie Adult

예제 7: 반복문(for) 사용

  • 한 사람의 모든 점수 합계 구하기:

학생 점수 파일(students.txt):

Name Math Science English
Alice 90 80 85
Bob 75 85 80
Charlie 95 90 100
  • 각 학생의 총점과 평균 계산:
awk 'NR > 1 {
  total = 0;
  for (i = 2; i <= NF; i++) {
    total += $i;
  }
  avg = total / (NF - 1);
  print $1, "Total:", total, "Average:", avg
}' students.txt
  • 결과:
Alice Total: 255 Average: 85
Bob Total: 240 Average: 80
Charlie Total: 285 Average: 95

8. 내장 함수 활용

예제 8: 문자열 함수

  • 문자 개수 세기:
awk '{ print $1, "Length:", length($1) }' data.txt
  • 결과:
Alice Length: 5
Bob Length: 3
Charlie Length: 7
함수 설명
length(string) 문자열의 길이를 반환합니다.

예제 9: 수학 함수

  • 로그 계산:
echo "Number 1000" | awk '{ print $1, $2, "Log:", log($2) }'

결과:

Number 1000 Log: 6.90776
함수 설명
log(number) 자연 로그 값을 반환합니다.

9. BEGIN과 END 블록

키워드 설명
BEGIN 파일을 읽기 전에 한 번 실행됩니다.
END 모든 처리가 끝난 후 한 번 실행됩니다.

예제 10: 헤더와 푸터 추가

awk 'BEGIN { print "Report Start" } { print $0 } END { print "Report End" }' data.txt
  • 결과:
Report Start
Alice 30 Developer
Bob 25 Designer
Charlie 35 Manager
Report End

10. 외부 변수와 함께 사용

예제 11: 쉘 변수 전달

threshold=30
awk -v age="$threshold" '$2 >= age { print $1, $2 }' data.txt
  • 결과:
Alice 30
Charlie 35
명령 설명
-v 변수명=값 awk 스크립트 내에서 변수 사용이 가능합니다.

11. 스크립트 파일로 작성하기

복잡한 awk 스크립트는 별도의 파일로 저장하여 실행할 수 있습니다.

예제 12: 스크립트 파일 생성

script.awk 내용:

#!/usr/bin/awk -f

BEGIN {
  FS=" "
  print "Name\tAge\tRole"
  print "------------------------"
}

{
  if (NR > 1) {
    printf "%s\t%d\t%s\n", $1, $2, $3
  }
}

END {
  print "------------------------"
  print "Total Records:", NR - 1
}
  • 실행 방법:
chmod +x script.awk
./script.awk data.txt
  • 결과:
Name    Age Role
------------------------
Alice   30  Developer
Bob 25  Designer
Charlie 35  Manager
------------------------
Total Records: 3

12. 고급 기능

12.1. 배열과 연관 배열

awk는 배열과 연관 배열(해시 테이블)을 지원합니다.

예제 13: 단어 개수 세기

awk '{ for (i = 1; i <= NF; i++) word[$i]++ } END { for (w in word) print w, word[w] }' text.txt
명령 설명
word[$i]++ 각 단어를 키로 하여 빈도수를 셉니다.

12.2. 서브셸 호출

외부 명령이나 서브셸을 호출할 수 있습니다.

예제 14: 시스템 명령 실행

awk 'BEGIN { "date" | getline d; print "Current Date:", d }'
명령 설명
"명령어" | getline 변수 명령어의 출력을 변수에 저장합니다.

13. 실제 활용 예시

13.1. 로그 파일 분석

예제 15: 특정 기간의 로그 추출

awk '/2023-10-11 10:/ { print $0 }' system.log
명령 설명
/2023-10-11 10:/ 2023년 10월 11일 10시의 로그를 추출합니다.

13.2. 데이터 변환

예제 16: 대문자로 변환

awk '{ print toupper($0) }' lowercase.txt
명령 설명
toupper(string) 문자열을 대문자로 변환합니다.