본문 바로가기
Tools2026년 6월 30일4분 읽기

grep·awk·sed 실전 — 로그에서 원하는 것만 뽑기

YS
김영삼
조회 471
grep·awk·sed 실전 — 로그에서 원하는 것만 뽑기

핵심 요약

텍스트 처리 3종 세트는 역할이 다르다 — grep은 "찾기"(줄 필터), awk는 "자르기·계산"(컬럼 단위 처리), sed는 "바꾸기"(치환). 파이프로 이으면 로그 분석 대부분을 커맨드 한 줄로 끝낼 수 있다.

1. grep — 원하는 줄만

grep "ERROR" app.log            # ERROR 포함 줄
grep -i "error" app.log         # 대소문자 무시
grep -c "ERROR" app.log         # 개수만
grep -n "ERROR" app.log         # 줄번호와 함께
grep -v "health" app.log        # 제외(반전)
grep -rE "user_id=\d+" .        # 재귀 + 정규식

2. awk — 컬럼 잘라내고 집계

# 공백 구분 3번째 필드만
awk '{print $3}' access.log

# 상태코드(9번째 필드)가 500 이상인 줄
awk '$9 >= 500' access.log

# IP별 요청 수 집계
awk '{c[$1]++} END{for(k in c) print c[k], k}' access.log | sort -rn

awk는 "줄을 필드로 쪼개서 조건·계산"에 강하다. $1은 첫 필드, $0은 줄 전체.

3. sed — 치환과 삭제

sed 's/foo/bar/g' file          # foo→bar 전체 치환
sed -n '10,20p' file            # 10~20번째 줄만 출력
sed '/DEBUG/d' app.log          # DEBUG 줄 삭제
sed -i.bak 's/old/new/g' file   # 파일 직접 수정(.bak 백업)

4. 파이프로 조합하기

# 에러 줄에서 시간(1번 필드)만 뽑아 분당 발생 수
grep ERROR app.log | awk '{print $1}' | cut -c1-16 | uniq -c

# 접속 상위 IP 10개
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

5. 함정

  • sed -i는 파일을 즉시 덮어쓴다 — 반드시 -i.bak으로 백업하거나 먼저 출력으로 확인
  • grep 정규식은 기본이 BRE다. +·?를 쓰려면 -E(확장 정규식)
  • 거대 로그는 grep으로 먼저 줄여서 awk/sed에 넘겨야 빠르다

자주 묻는 질문

awk와 cut은 언제 구분해서 쓰나요?

단순히 고정 구분자로 특정 필드만 뽑으면 cut -d' ' -f3이 가볍습니다. 조건 필터·집계·계산이 필요하면 awk가 낫습니다. 공백이 여러 개 섞인 로그는 cut이 헷갈리므로 awk가 안전합니다.

sed로 여러 줄에 걸친 치환도 되나요?

기본 sed는 줄 단위라 여러 줄 패턴은 까다롭습니다. 간단한 건 N 명령으로 줄을 합쳐 처리하지만, 복잡하면 perl(perl -0777 -pe)이나 스크립트 언어를 쓰는 게 현실적입니다.

grep으로 찾은 앞뒤 줄도 같이 보고 싶어요.

-A 3(뒤 3줄), -B 2(앞 2줄), -C 3(앞뒤 3줄)을 쓰면 문맥을 함께 볼 수 있습니다. 에러 스택트레이스를 볼 때 특히 유용합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록