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를 쓰고, 출력이 필요하면 마스킹한 복사본이나 허용된 필드만 대상으로 삼는다.
확인 순서
- 문자열 그대로 찾는다면
-F부터 고려한다. - 정규식이 필요할 때만
-E를 쓴다. - 파일·디렉터리 범위를 좁힌다.
- 문맥이 필요하면
-A,-B,-C를 추가한다. - 자동화에서는 출력이 아니라 종료 코드를 처리한다.
세부 옵션과 플랫폼별 차이는 GNU grep 공식 매뉴얼에서 확인할 수 있다. macOS 기본 grep과 GNU grep의 지원 옵션은 다를 수 있으므로 배포 스크립트에서는 대상 환경의 man grep도 함께 확인한다.
'배움과 성장 > DevOps·클라우드' 카테고리의 다른 글
| 빌드 시스템·의존성 관리·CI: 메타프로그래밍 강의 핵심 정리 (0) | 2025.09.08 |
|---|---|
| 리눅스 셸 작업 관리: jobs·nohup·tmux·SSH 연결 구분하기 (2) | 2025.08.30 |
| DevOps·SRE 지표 설계: 역할별 숫자보다 Delivery·Reliability 결과 보기 (0) | 2025.03.08 |
| Kubernetes Spot 중단 대응: 단일 Pod 무중단이 불가능한 이유 (0) | 2024.09.20 |
| Kubernetes requests·limits·QoS: CPU throttling과 OOM 이해 (0) | 2024.09.20 |
댓글