grep은 패턴에 맞는 줄을 고른다. 로그에서 오류를 찾거나, 설정에서 한 항목을 뽑을 때 쓴다. GNU grep이다. `grep --version`으로 확인할 수 있다.

Bash
grep error app.log
grep -n error app.log
grep -i error app.log
grep -v '^#' config.txt
grep -w main src/main.c
grep -c error app.log
grep -l error *.log

`-n`은 줄 번호, `-i`는 영문 대소문자를 가리지 않는다. `-v`는 패턴에 맞지 않는 줄이다. `-w`는 단어 전체일 때만 맞는다. `-x`는 줄 전체가 패턴과 같을 때다. `-c`는 맞는 줄의 개수만, `-l`은 맞는 파일 이름만 출력한다. `-L`은 맞지 않는 파일 이름이다.

앞뒤 줄

Bash
grep -n -C 2 error app.log
grep -n -A 5 error app.log
grep -n -B 1 error app.log

`-C`는 앞뒤, `-A`는 뒤, `-B`는 앞이다. 숫자는 줄 수다.

디렉터리

Bash
grep -n -r --exclude-dir=.git error .

`-r`은 하위 디렉터리까지 본다. 심볼릭 링크인 디렉터리는 따라가지 않는다. 링크까지 따라가려면 `-R`이다. `--exclude-dir`로 `.git`처럼 제외할 디렉터리를 지정한다.

파일이 둘 이상이면 줄 앞에 파일 이름이 붙는다. 파일이 하나면 생략한다. `-H`는 항상 파일 이름을 붙인다.

정규식과 글자 그대로

기본 패턴은 기본 정규식이다. 점 `.`은 아무 한 글자, `^`는 줄의 앞, `$`는 줄의 끝이다. `*`는 바로 앞 항목의 반복이다.

글자 그대로 찾으면 `-F`를 쓴다. 점과 별이 특수 문자가 아니게 된다. `|`와 `+`를 역슬래시 없이 쓰려면 `-E`로 확장 정규식을 켠다.

Bash
grep -F 'a.b' file.txt
grep -E 'error|warn' app.log

패턴은 작은따옴표로 감싼다. 큰따옴표나 따옴표 없음은 셸이 `$`와 `*`를 먼저 해석한다.

GNU grep의 `-P`는 Perl 호환 정규식이다. 설치와 버전에 따라 없을 수 있다. 옮길 스크립트에는 `-E`와 `-F`가 안전하다.

종료 상태

맞는 줄이 있으면 0, 없으면 1, 오류면 2로 끝난다. `&&`와 `||`로 이어 쓸 때 이 값을 본다.

Bash
grep -q error app.log && echo 있음

`-q`는 출력하지 않고 있는지 여부만 돌려준다. 첫 맞춤에서 멈춘다.

바이너리 파일에서 맞으면 줄 대신 `Binary file ... matches`라고만 알려 주는 경우가 있다. 텍스트로 보고 싶으면 `-a`를 붙인다.