우분투 실전 명령어 | 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