우분투 실전 명령어 | grep로 에러 줄과 주변 문맥 빠르게 찾기

로그에서 에러 한 줄만 보는 것과 앞뒤 문맥까지 함께 보는 것은 문제 해결 속도가 크게 다릅니다. grep의 컨텍스트 옵션을 익혀 두면 장애 원인을 훨씬 빨리 좁힐 수 있습니다.

언제 쓰는가

  • 애플리케이션 로그에서 ERROR, WARN 주변 흐름까지 함께 확인하고 싶을 때
  • 배포 직후 실패 구간의 직전/직후 로그를 묶어서 보고 싶을 때
  • 대용량 로그에서 일단 범위를 줄인 뒤 다음 분석 명령으로 넘기고 싶을 때

바로 쓰는 명령어

grep -nC 3 "ERROR" /var/log/myapp/app.log
grep -Rni --include='*.log' -E "timeout|connection refused" /var/log/myapp

핵심 옵션/패턴

  • -n: 매칭된 줄 번호를 함께 보여 줍니다. 장애 재현 시점과 코드 라인 매핑이 쉬워집니다.
  • -C N: 매칭 줄 전후 N줄을 같이 출력합니다. -A N은 이후 N줄, -B N은 이전 N줄만 출력합니다.
  • -R: 하위 디렉터리까지 재귀 검색합니다.
  • -i: 대소문자 구분 없이 검색합니다.
  • -E: 확장 정규식을 사용합니다. timeout|refused 같이 OR 패턴을 간단히 쓸 수 있습니다.
  • --include='*.log': 특정 확장자 파일만 대상으로 좁혀 불필요한 스캔을 줄입니다.

실전 패턴

# 최근 로그에서 에러 주변 5줄 확인
tail -n 2000 /var/log/myapp/app.log | grep -nC 5 "ERROR"

# 여러 패턴을 한 번에 찾고, 건수까지 바로 확인
grep -RniE "error|fail|denied" /var/log/myapp --include='*.log' | tee /tmp/grep_hits.log
wc -l /tmp/grep_hits.log

명령 출력 예시

218:INFO  DB reconnect start
219:WARN  retry=1
220:ERROR connection refused to 10.10.0.12:5432
221:INFO  fallback replica enabled
222:INFO  request_id=9f2a completed with degraded mode
$ wc -l /tmp/grep_hits.log
47 /tmp/grep_hits.log

자주 하는 실수

  • 따옴표 없이 패턴을 써서 셸 확장이나 공백 분리로 의도와 다른 검색이 되는 경우
  • -R을 루트 경로에 무심코 사용해 검색 범위가 과도하게 커지고 서버 부하가 커지는 경우
  • 로그 포맷이 JSON인데 단순 문자열 검색만 하고 jq 같은 후속 필터링을 생략하는 경우

검증 방법

# 1) 실제로 문맥이 붙어 나오는지 확인
grep -nC 2 "ERROR" /var/log/myapp/app.log | head -n 20

# 2) 검색 대상 파일 수가 과도하지 않은지 확인
find /var/log/myapp -type f -name '*.log' | wc -l

# 3) 검색 결과 건수와 샘플 검토
grep -RniE "error|fail|denied" /var/log/myapp --include='*.log' | tee /tmp/grep_hits.log
wc -l /tmp/grep_hits.log
sed -n '1,20p' /tmp/grep_hits.log

운영 팁

  • 장애 초기에 -C 3으로 빠르게 훑고, 원인 후보가 보이면 -C 20으로 확장해 타임라인을 확인하면 효율적입니다.
  • 반복 점검은 패턴을 파일로 관리해 두면 좋습니다. 예를 들어 grep -RniEf patterns.txt /var/log/myapp 형태로 팀 표준을 만들면 누락을 줄일 수 있습니다.

출처

  • GNU Grep Manual
  • Ubuntu Manpage
  • The Linux Documentation Project