topic난이도 · 약 20

로그 파싱 & 데이터 추출 — grep · awk · jq

grep(검색) · awk(열 처리) · jq(JSON 다루기) — 터미널에서 텍스트를 요리하는 3인조.

#grep#awk#jq#ripgrep#로그파싱
왜 배우는가

에러 로그에서 5xx만 추출, JSON 응답에서 필드만 꺼내기, Nginx 로그에서 상위 IP — 전부 이 3도구로 10초 안에. Claude가 한 줄 파이프라인으로 뽑아줄 때 이해할 수 있어야 한다.

grep = 필터, awk = 열 조작, jq = JSON 전용. 파이프(`|`)로 이어 붙이면 엑셀·DB 없이 터미널만으로 강력한 분석 파이프라인.

bash
# ━━━ grep — 줄 단위 검색 ━━━
grep "ERROR" app.log                    # "ERROR" 포함 줄
grep -i "error" app.log                 # 대소문자 무시
grep -v "DEBUG" app.log                 # 역 매칭 (DEBUG 제외)
grep -E "5[0-9]{2}" access.log          # regex — 5xx 상태코드
grep -C 3 "ERROR" app.log               # 매칭 줄 + 앞뒤 3줄 (맥락)
grep -rn "TODO" src/                    # 재귀 + 줄번호

# ripgrep(rg)은 grep 상위호환 — 속도·기본 재귀·.gitignore 존중
rg "TODO" src/                          # 현대 터미널 표준

# ━━━ awk — 열(column) 조작의 왕 ━━━
# Nginx 로그: 127.0.0.1 - - [...] "GET / HTTP/1.1" 200 1234
awk '{print $1}' access.log             # 첫 열(IP)만 출력
awk '$9 >= 500 {print $7}' access.log   # 상태코드 500+ 요청의 URL만
awk '{sum += $10} END {print sum}'      # 10번째 열 합계 (전체 트래픽)

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

# ━━━ jq — JSON 처리 ━━━
curl -s https://api.example.com/users | jq '.'           # 보기 좋게
curl -s .../users | jq '.[].email'                       # 배열의 email만
curl -s .../users | jq '.[] | select(.age >= 20)'        # 필터
curl -s .../users | jq '[.[] | {name, email}]'           # 맵핑 + 배열화
cat resp.json | jq -r '.items[].id'                      # 따옴표 제거(-r)

Claude가 `awk '...'` 한 줄을 뱉을 때 겁먹지 말자. "`$1`이 첫 열, `>= 500`이 조건" 정도만 읽히면 충분.

실전 조합 — 에러 분석 파이프라인. "지난 한 시간 ERROR 로그에서 가장 많이 나온 메시지 top 5" 같은 작업이 파이프 한 줄. 이게 터미널의 힘.

bash
# 시나리오 1: ERROR 메시지 빈도 랭킹
grep "ERROR" app.log \
  | awk -F': ' '{print $NF}' \   # ": " 기준 마지막 필드
  | sort | uniq -c | sort -rn | head -5

# 시나리오 2: Nginx 5xx 에러 URL top 10 + 시간 필터
awk '$4 ~ /14\/Mar/ && $9 >= 500 {print $7}' access.log \
  | sort | uniq -c | sort -rn | head -10

# 시나리오 3: 로그 실시간 관찰 + 필터
tail -f app.log | grep --line-buffered "ERROR"

# 시나리오 4: JSON API 응답 → CSV
curl -s https://api/users \
  | jq -r '.[] | [.id, .email, .name] | @csv' \
  > users.csv

이 패턴들을 Claude에게 "Nginx 로그에서 어제 5xx 상위 URL 10개 뽑아줘"로 요청하면 위와 비슷한 한 줄을 돌려준다.

구조화 로그(Structured Logging)를 쓰면 jq만으로 분석 끝. JSON 한 줄당 한 이벤트(`{"ts":"...","level":"error","msg":"..."}`) → `jq 'select(.level=="error")'`. pino(Node)·structlog(Python)·zap(Go)이 표준.

실기 드릴 2문항
edit실기 드릴 · 단답형

JSON 배열에서 특정 조건을 만족하는 객체만 뽑을 때 쓰는 CLI 도구는?

edit실기 드릴 · 단답형

공백 구분 로그에서 N번째 열만 추출하는 전형적 명령은?