grep

여러분이 개발자라면, 한 번이라도 터미널을 사용해 보았다면 한 번쯤은 반드시 사용해 보았을 명령어다. 주로 파일(텍스트)에서 특정 패턴을 검색하는 데 유용하다. 로그 분석, 설정 파일 검색, 소스 코드 내 특정 문자열 찾기 등에 활용할 수 있다.

만약 cli에 익숙하다면, 혹은 적절한 GUI를 사용할 수 없는 환경이라면(현대의 에디터에서 Cmd + F 와 같은 찾기 명령어) grep은 여러분이 하고자하는 거의 모든 것을 할 수 있는 유용한 도구가 될 것이다.


1. 특정 문자열 포함된 행 찾기

# 로그 파일에서 "error"가 포함된 행을 찾는다.
grep --text "error" application.log  # -a

2. 대소문자 구분 없이 검색

# Ignore case, 그러니까 대소문자 구분 없이 "Warning", "WARNING", "warning" 등을 모두 검색할 때 사용한다.
grep --ignore-case "warning" application.log # -i

3. 특정 단어만 검색

# "failed"나 "failing"은 제외하고 "fail"이라는 단어만 검색한다.
grep --word-regexp "fail" application.log  # -w

4. 검색 결과에서 특정 단어 제외

# "error"가 포함된 행 중 "timeout"이 없는 행만 출력한다.
grep --text "error" application.log | grep --invert-match "timeout"  # -v

5. 줄 번호 함께 출력

# 소스 코드에서 "TODO"가 있는 줄 번호를 함께 출력한다.
grep --line-number "TODO" source_code.java  # -n

6. 검색 결과 앞뒤 줄도 함께 출력

# "Exception"이 포함된 행을 기준으로 앞 2줄, 뒤 3줄까지 함께 출력한다.
grep --text "Exception" application.log --before-context=2 --after-context=3  # -B 2 -A 3

7. 특정 파일 확장자에서 검색

# src/ 디렉터리에서 .java 파일만 대상으로 "import"가 포함된 행을 검색한다.
grep --text "import" --recursive --include="*.java" src/

8. 특정 파일 제외하고 검색

# config/ 디렉터리에서 "password"가 포함된 행을 검색하되, .log 파일은 제외한다.
grep --text "password" --recursive --exclude="*.log" config/

# 자매품. 특정 디렉토리를 제외하고 검색한다
grep --text "error" --recursive --exclude-dir="logs" src/

9. 하위 디렉터리 포함하여 검색

# project/ 디렉터리 내부의 모든 파일에서 "TODO"를 검색한다.
grep --text "TODO" --recursive project/  # -a -r

10. 검색 결과에서 파일 이름만 출력

# src/ 디렉터리에서 "FIXME"가 포함된 파일 이름만 출력한다.
grep --text "FIXME" --recursive --files-with-matches src/  # -a -r -l

이처럼 grep을 활용하면 텍스트 검색 작업을 효과적으로 수행할 수 있다. descriptive option을 사용하면 명령어의 가독성이 높아지고, short option은 입력을 줄이는 데 유용하다. 😃