홈 › 리눅스 운영 › 02 / 13

텍스트 처리 (grep·sed·awk)

섹션 7진행 0 / 13

3. 코드 예제

예제 1: 로그에서 에러 찾기 — 01_grep_sed.sh 발췌

bash
grep -n ERROR app.log                       # 줄 번호와 함께
grep -c ERROR app.log                       # 2
grep -A2 'ERROR.*500' app.log               # 스택 트레이스 2줄 포함
grep -E ' (5[0-9]{2}) ' app.log             # 5xx 응답 줄
grep -oE '/api/[a-z]+' app.log | sort | uniq -c
text
4:2026-09-10 09:00:07 ERROR [http-3] POST /api/orders 500 45ms
8:2026-09-10 09:01:10 ERROR [http-5] GET /api/pay 502 3001ms
2
      3 /api/orders
      1 /api/pay

-A2 출력에는 java.lang.NullPointerException 과 at com.shop... 줄이 따라옵니다. 예외 클래스만 모으려면 grep -E '^java\.|^org\.' 로 줄 첫머리를 봅니다.

예제 2: 설정 파일 치환 — 01_grep_sed.sh 발췌

bash
grep -vE '^\s*(#|$)' app.properties         # 주석·빈 줄 제외
sed -i.bak 's/^server.port=.*/server.port=9090/' app.properties
sed -i 's/^logging.level.root=DEBUG/logging.level.root=INFO/' app.properties
sed -i '/password/s/=.*/=****/' app.properties
diff app.properties.bak app.properties
text
1c1
< server.port=8080
---
> server.port=9090
5c5
< logging.level.root=DEBUG
---
> logging.level.root=INFO

diff 의 1c1 은 1번 줄이 바뀌었다는 뜻입니다. 배포 스크립트에서 이 diff 출력을 로그로 남기면 어떤 값이 언제 바뀌었는지 추적됩니다.

예제 3: awk 로 응답 시간 통계 — 01_grep_sed.sh 발췌

bash
awk '/^2026/{print $3}' app.log | sort | uniq -c
grep -E '[0-9]+ms
  

 app.log | awk '{ms=$NF+0; n++; s+=ms; if(ms>mx)mx=ms}
  END{printf "count=%d sum=%d avg=%.1f max=%d\n", n, s, s/n, mx}'
awk '/ms$/ && $6 ~ /^\// {ms=$NF+0; c[$6]++; t[$6]+=ms}
  END{for(k in c) printf "%-16s n=%d avg=%.0fms\n", k, c[k], t[k]/c[k]}' app.log | sort
text
      2 ERROR
      4 INFO
      1 WARN
count=5 sum=3067 avg=613.4 max=3001
/api/orders      n=2 avg=28ms
/api/orders/7    n=1 avg=8ms
/api/pay         n=1 avg=3001ms
/health          n=1 avg=1ms

첫 줄의 /^2026/ 은 날짜로 시작하는 줄만 세는 조건입니다. 이걸 빼면 스택 트레이스 줄의 3번째 단어까지 레벨로 세어 결과가 오염됩니다.

예제 4: 실제 장애 분석 흐름

장애 신고를 받고 로그를 보는 순서입니다. 각 단계는 앞 단계 결과를 좁힙니다.

bash
cd /var/log/myapp
grep -c ERROR app.log                       # 1. 규모 파악
grep ERROR app.log | cut -c12-16 | uniq -c  # 2. 분 단위 분포
sed -n '/14:32:00/,/14:35:00/p' app.log > incident.log   # 3. 구간 저장
grep -E '^(java|org)\.' incident.log | sort | uniq -c | sort -rn   # 4. 예외 종류
grep -B3 'Read timed out' incident.log | head -n 20   # 5. 직전 요청 확인

cut -c12-16 은 09:00:07 에서 09:00 다섯 글자만 남깁니다. 시각 형식이 다른 로그는 자릿수를 맞춰 조정합니다.