grep 명령어 실전 가이드: 로그 검색부터 정규식·스크립트까지

반응형

grep은 입력에서 패턴과 일치하는 줄을 찾는 도구다. 로그 한 줄을 찾는 데서 시작하지만, 고정 문자열과 정규식을 구분하고 종료 코드를 이용하면 운영 점검과 셸 스크립트에서도 안전하게 쓸 수 있다.

가장 먼저 쓸 기본형

grep [옵션] '패턴' 파일
grep -n 'ERROR' app.log

app.log에서 ERROR가 포함된 줄과 줄 번호를 출력한다. 패턴에는 공백이나 셸 특수문자가 들어갈 수 있으므로 작은따옴표로 감싸는 습관이 좋다.

자주 쓰는 옵션

옵션 의미 예시
-i 영문 대소문자를 구분하지 않음 grep -i 'warning' app.log
-n 줄 번호 표시 grep -n 'exception' app.log
-v 일치하지 않는 줄 출력 grep -v 'DEBUG' app.log
-o 줄 전체 대신 일치한 부분만 출력 grep -oE 'user[0-9]+' users.txt
-c 일치한 줄 수 출력 grep -c ' 500 ' access.log
-l 일치 항목이 있는 파일 이름만 출력 grep -rl 'timeout' config/
-A 3 일치한 줄 뒤 3줄 표시 grep -A 3 'database:' config.yaml
-B 3 앞 3줄 표시 grep -B 3 'panic' kernel.log
-C 3 앞뒤 3줄 표시 grep -C 3 'failed' service.log

고정 문자열과 정규식을 먼저 구분하기

마침표나 대괄호처럼 정규식 의미가 있는 문자를 그대로 찾을 때는 -F가 명확하다.

grep -F '10.0.0.1' access.log

여러 패턴이나 반복 조건이 필요하면 확장 정규식 -E를 쓴다.

grep -nE 'ERROR|WARN|timeout' app.log
grep -oE 'user[0-9]+' users.txt

grep -E 'fail|error'fail 또는 error가 있는 줄을 찾는다. 반면 grep 'fail|error'에서 |는 기본 정규식 설정에 따라 일반 문자로 취급될 수 있다.

디렉터리에서 재귀 검색하기

grep -rn --include='*.yaml' 'image:' ./manifests

-r은 하위 디렉터리를 재귀적으로 읽고, --include는 검색할 파일을 제한한다. 큰 저장소에서는 바이너리와 생성물을 피하도록 범위를 먼저 좁히는 것이 빠르다.

grep -rIl --exclude-dir='.git' 'deprecated-api' .
  • -I: 바이너리로 판단한 파일을 건너뜀
  • -l: 일치한 파일 이름만 출력
  • --exclude-dir: 특정 디렉터리 제외

심볼릭 링크까지 따라가는 -R은 의도치 않은 범위를 읽을 수 있으므로 필요할 때만 사용한다.

운영 로그에서 쓰는 조합

새로 추가되는 로그에서 오류만 보기

tail -F /var/log/nginx/error.log | grep --line-buffered -i 'timeout'

tail -F는 로그 로테이션 뒤에도 파일을 다시 열어 추적한다. 파이프에서 결과를 바로 보고 싶을 때 GNU grep의 --line-buffered를 사용할 수 있지만, 버퍼링 방식이 달라져 성능 비용이 생길 수 있다.

프로세스 찾기

pgrep -af nginx

ps aux | grep nginx는 grep 프로세스 자체까지 결과에 섞일 수 있다. 프로세스 이름이나 전체 명령줄을 찾는 목적이라면 pgrep -af가 더 직접적이다.

cat 없이 파일 검색하기

grep -A 3 'database:' config.yaml

cat config.yaml | grep ...도 동작하지만 grep이 파일을 직접 읽을 수 있어 중간 프로세스가 필요 없다. 표준 입력을 파이프로 받는 상황과 파일을 직접 읽는 상황을 구분하면 된다.

셸 스크립트에서는 출력보다 종료 코드

grep의 종료 코드는 스크립트 분기에 사용할 수 있다.

  • 0: 한 줄 이상 일치
  • 1: 일치 없음
  • 2: 오류 발생
if grep -qF 'feature.enabled=true' app.properties; then
  echo 'feature is enabled'
else
  echo 'feature is disabled or missing'
fi

-q는 일치 여부만 필요할 때 출력을 생략한다. 다만 set -e가 켜진 스크립트에서는 “일치 없음”을 실패로 처리할 수 있으므로 if 조건 안에서 쓰는 편이 안전하다.

놓치기 쉬운 안전 장치

하이픈으로 시작하는 패턴

grep -- '-Xmx' java-options.txt

-- 뒤의 값을 옵션이 아니라 패턴으로 해석하게 한다.

파일 이름도 함께 보기

여러 파일을 검색할 때는 기본적으로 파일 이름이 나오지만, 입력 형태에 따라 달라질 수 있다. 항상 표시하려면 -H, 숨기려면 -h를 쓴다.

비밀값을 그대로 출력하지 않기

환경 변수, 토큰과 인증서가 섞인 로그를 검색하면 터미널 기록이나 CI 로그에 값이 남을 수 있다. 존재 여부만 확인한다면 -q를 쓰고, 출력이 필요하면 마스킹한 복사본이나 허용된 필드만 대상으로 삼는다.

확인 순서

  1. 문자열 그대로 찾는다면 -F부터 고려한다.
  2. 정규식이 필요할 때만 -E를 쓴다.
  3. 파일·디렉터리 범위를 좁힌다.
  4. 문맥이 필요하면 -A, -B, -C를 추가한다.
  5. 자동화에서는 출력이 아니라 종료 코드를 처리한다.

세부 옵션과 플랫폼별 차이는 GNU grep 공식 매뉴얼에서 확인할 수 있다. macOS 기본 grep과 GNU grep의 지원 옵션은 다를 수 있으므로 배포 스크립트에서는 대상 환경의 man grep도 함께 확인한다.

반응형
KEEP READING
카테고리 전체 보기 →

댓글