본문 바로가기

리눅스

리눅스 awk 명령어 사용법 정리

반응형

리눅스 awk 명령어 사용법 정리

awk는 텍스트 기반 데이터를 패턴 매칭 + 필드 처리 + 연산을 통해 가공하는 강력한 CLI 도구입니다.

 

특히 로그 분석, 리포트 생성, 데이터 변환 작업에서 매우 유용합니다.

특징

  • 필드 기반 처리 (column 처리)
  • 정규식 지원
  • 변수 / 조건문 / 반복문 지원
  • C-like 문법

1. 기본 구조

awk [옵션] 'pattern { action }' file

또는

awk [옵션] -f script.awk file

레코드와 필드

  • 레코드 (Record) : 한 줄 (기본: newline 기준)
  • 필드 (Field) : 공백 기준으로 나뉜 값

패턴과 액션

pattern { action }
  • pattern만 : 조건 만족 라인 출력
  • action만 : 모든 라인에 적용

주요 옵션

-F (필드 구분자)

awk -F ':' '{print $1}' /etc/passwd
  • : 기준으로 필드 분리

-v (변수 전달)

awk -v limit=100 '$2 > limit'

-f (스크립트 파일)

awk -f script.awk input.txt

BEGIN / END 블록

BEGIN { 초기화 }
{ 본 처리 }
END { 결과 출력 }

예제

awk 'BEGIN {sum=0} {sum+=$2} END {print sum}' file

2. 패턴 (조건)

정규식

/good/
$1 ~ /good/
$1 !~ /bad/

비교 연산

$2 > 100
NF == 4

복합 조건

NF == 4 && /^good/

3. 자주 사용하는 예제

특정 문자열 포함 라인

awk '/error/' logfile

특정 필드 출력

awk '{print $1, $3}'

조건 + 필드 출력

awk '$1 ~ /good/ {print $3, $2}'

카운트

awk '/good/ {count++} END {print count}'

합계 계산

awk '{sum += $2} END {print sum}'

짝수 라인 출력

awk 'NR % 2 == 0'

라인 수 출력

awk 'END {print NR}'

빈 줄 제거

awk 'NF > 0'

파일 크기 합계

ls -l | awk '{sum += $5} END {print sum}'
728x90

4. 실무 활용 예제 (중요)

로그 필터링 (응답 크기 기준)

awk '$6 > 4000' access.log

특정 IP 추출

awk '{for(i=1;i<=NF;i++) if($i ~ /dst=/) print $i}' file

특정 필드만 반복 출력

awk '{for(i=1;i<NF;i++) print $i}'

CSV 처리

awk -F ',' '{print $1, $3}' file.csv

주요 내장 변수

  • FS 입력 필드 구분자
  • OFS 출력 필드 구분자
  • RS 레코드 구분자
  • ORS 출력 레코드 구분자
  • NF 필드 개수
  • NR 전체 레코드 번호
  • FNR 파일별 레코드 번호
  • FILENAME 파일 이름

문자열 함수

  • length(s) 길이
  • index(s1,s2) 위치
  • substr(s,m,n) 부분 문자열
  • split(s,arr,sep) 배열 분리
  • gsub(r,s) 전체 치환
  • sub(r,s) 첫 번째 치환
  • tolower() 소문자
  • toupper() 대문자
  • 11. 수치 함수
  • int(x) 정수 변환
  • sqrt(x) 제곱근
  • rand() 난수
  • srand() 난수 초기화

입출력/제어

  • print 출력
  • printf 포맷 출력
  • getline 다음 라인 읽기
  • next 다음 레코드
  • system() 쉘 명령 실행

5. 제어문

if (조건) { }
else { }

for (i=1; i<=NF; i++) { }

while (조건) { }

6. 고급 팁

레코드/필드 구분 변경

BEGIN {
    FS = "\n"
    RS = ""
}
  • 빈 줄 기준 레코드 분리

포맷 출력

awk '{printf "%-10s %5d\n", $1, $2}'

난수 생성

awk 'BEGIN {srand(); for(i=1;i<=7;i++) print int(100*rand())}'

7. awk vs sed vs grep

  • grep 검색
  • sed 치환
  • awk 분석 + 연산

로그에서 특정 필드(예: 응답 크기)가 4000 이상인 행 필터링

awk '{ if ($6+0 > 4000) print }' access_log.2014-01-02-05.log

 

awk -F'dst=' '{if(NF>1) print $2}' messages

또는

awk '{
  for(i=1;i<=NF;i++) {
    if($i ~ /dst=168.126.63.1/)
      print $i
  }
}' messages

 

728x90
반응형