줄 가운데 패턴과 맞는 항목을 찾아
grep은 파일이나 stdin을 읽어 정규식과 일치하는 줄을 출력해. 기본 문법은 BRE이고 -E는 ERE, 구현이 지원하는 -P는 PCRE 계열을 선택해. 셸 글로브와 정규식은 서로 다른 언어이므로 패턴을 따옴표로 감싸 셸이 먼저 확장하지 않게 해. 찾고 싶은 것이 고정 문자열이면 -F를 사용하면 정규식 메타 문자를 피할 수 있어.
자주 쓰는 플래그를 목적별로 묶어
-i: 대소문자를 구분하지 않아.-r또는-R: 디렉터리를 재귀 검색해. 심볼릭 링크 처리 차이를 확인해.-n: 줄 번호를 붙여.-v: 일치하지 않는 줄을 골라.-l: 일치 항목이 있는 파일 이름만 보여 줘.-c: 일치한 줄 수를 세어.-A 3,-B 3,-C 3: 뒤·앞·양쪽 문맥을 보여 줘.--include와--exclude: 검색할 파일 집합을 제한해.
지원 옵션은 BSD grep과 GNU grep에서 다를 수 있으므로 현재 구현의 도움말을 확인해.
검색 범위를 먼저 줄여
grep -rni --include='*.py' 'todo' .
grep -rl --exclude-dir=node_modules 'DATABASE_URL' .
grep -nC 2 -E 'error|warning' app.log
grep -c '^GET ' access.log저장소 전체를 무작정 검색하기보다 파일 확장자와 제외할 생성 디렉터리를 정하면 결과와 실행 시간이 모두 예측하기 쉬워. 바이너리 파일을 만날 수 있다면 해당 구현의 바이너리 처리 옵션도 확인해.
종료 상태는 세 가지 의미를 가질 수 있어
grep은 보통 일치 항목이 있으면 0, 없으면 1, 읽기나 사용법 오류가 나면 2를 반환해. 따라서 “찾지 못함”과 “검색 자체가 실패함”을 같은 분기로 다루면 안 돼. 스크립트에서 존재 여부를 검사할 때는 if grep -q pattern file; then ...처럼 명령을 조건으로 쓰고, 중요한 경우 1과 2를 구분해 처리해.
텍스트 줄 검색이 맞지 않는 문제도 있어
여러 줄 구조, JSON·YAML의 키 경로, 프로그래밍 언어의 심볼 관계는 줄 단위 정규식만으로 다루기 어려워. 저장소 검색에는 ripgrep, 구조화 데이터에는 jq나 yq, 코드 관계에는 언어 서버나 구문 분석 도구가 더 정확할 수 있어. grep이 빠르다는 이유로 입력 구조를 잃지 말고 문제에 맞는 경계를 선택해.