[linux] 특정 문자열이 포함된 모든 파일을 찾기 - 리눅스 grep 커맨드 사용 방법

커맨드 기초 사용법


grep은 리눅스 및 유닉스 기반 시스템에서 사용하는 텍스트 검색 도구입니다. 다음은 몇 가지 grep 커맨드의 사용 예시입니다:

가장 기본적인 사용 방법은 다음과 같습니다. "파일명" 파일에서 "찾는문자열"이 있는 모든 행을 찾아서 출력합니다.

grep "찾는문자열" 파일명
grep 일치 결과 출력

"찾는문자열"은 '따옴표'로 표현할 수도 있습니다.

여러 파일에서 검색 문자열로 찾으려면 개별 파일명을 공백으로 구분해서 나열하거나, 와일드카드로 특정 확장자를 가진 파일만 검색할 수 있습니다. 파일 선택 범위를 자유롭게 설정할 수 있습됩니다.

grep '찾는문자열' 파일1 파일2 파일3
grep '찾는문자열' *.sql

grep 커맨드 옵션들

grep 커맨드의 주요 사용 옵션은 다음과 같습니다. 옵션은 한 개 이상을 조합해서 사용할 수 있으며, 영문자를 연달아 붙여서 표시합니다. -inr, -inl 옵션 조합을 주로 사용합니다.

  • -i : 대소문자를 구분하지 않고 검색합니다.
    grep -i 'keyword' filename.txt
  • -n : 검색 결과에 해당 라인 번호를 함께 출력합니다.
    grep -n 'keyword' filename.txt
  • -r 또는 -R : 지정한 디렉토리 및 하위 디렉토리에서 모든 파일을 검색합니다.
    grep -r 'keyword' directory
  • -E : 검색어로 정규표현식을 사용하여 검색합니다. 옵션을 사용하지 않으면 정규표현식 키워드는 일반 문자로 처리합니다.
    grep -E '^regex_pattern' filename.txt
  • -v : 지정한 검색어 패턴과 일치하지 않는 라인을 출력합니다. 일치하는 행을 제외한 나머지 모든 행이 출력되므로 주의해야 합니다.
    grep -v 'keyword' filename.txt
  • -w : 정확한 단어 일치만 검색합니다.
    grep -w 'keyword' filename.txt
  • -c : 일치하는 라인의 갯수만을 출력합니다.
    grep -c 'keyword' filename.txt
  • -l : 검색 패턴과 일치하는 텍스트가 있으면 해당 파일명만 출력합니다.
    grep -l 'keyword' *.txt
  • -A, -B, -C : 검색 패턴과 일치하는 라인 주위의 라인을 함께 출력합니다.
    grep -A 2 'keyword' filename.txt
  • -f : 외부 파일에서 여러 개의 검색 패턴을 읽어 검색합니다. 여러 개의 검색 패턴을 텍스트 파일에 행단위로 구분해서 작성한 후 불러와 일치하는 검색 패턴이 있는 모든 행을 표시해줍니다.
    grep -f keywords.txt filename.txt
  • --color : 검색 결과에서 일치하는 부분을 색상으로 강조해 출력합니다. 운영체제에 따라서는 grep 일치 결과를 표시할 때 색상이 기본 적용되기도 하기 때문에 단색으로 일치 문자열을 출력할 때만 사용하는 부가 옵션입니다.
    grep --color 'keyword' filename.txt

grep 사용 예

디렉토리 단위 검색

backup 디렉토리 안에 있는 모든 파일에서 대소문자 구분 없이 "create" 문자열이 있는지를 검색해 파일의 행 번호와 함께 결과를 출력하고 싶으면 다음과 같이 grep 커맨드 옵션을 사용합니다.

grep -inr "create" backup

검색 대상이 되는 파일을 표시할 때 디렉토리를 표시하고 "r" 옵션을 추가하면 해당 디렉토리와 그 하위 모든 디렉토리의 파일들이 검색 대상이 됩니다.

일치 결과 행을 행 번호와 함께 출력

정규표현식으로 검색

grep -E '정규표현식패턴' 파일명

정규표현식으로 일치하는 문자열을 찾으려면 "-E" 옵션을 사용해야 합니다. "-E" 옵션이 없으면 정규표현식의 예약어들이 일반 텍스트로 매칭됩니다.

다음 grep 커맨드는 schema.sql 파일에서 "varchar(정수1~3자리)" 패턴인 문자열을 찾습니다.

 grep -E "varchar\([0-9]{1,3}\)" schema.sql

파이프로 검색할 내용을 전달 받기

cat 커맨드로 출력한 파일 내용을 grep 으로 전달해서 "찾는문자열"이 있는지를 검색합니다.

cat 파일명 | grep '찾는문자열'

단어단위 일치하기

정확하게 일치하는 단어가 있을 때한 일치하는 행 결과로 표시합니다. 단어는 앞뒤가 공백으로 구분되어 분리된 문자열을 말합니다.

grep -w '찾을문자열' 파일명

찾은 문자열의 개수 출력

파일에서 일치하는 문자열이 있는 행의 개수를 카운트해서 개수를 출력합니다. 일치하는 문자열이 한 행에 여러 개 있어도 카운트는 1이 됩니다.

grep -c '찾을문자열' 파일명
6개의 일치 문자열이 있지만 카운트는 3으로 표시됨.

검색 대상 필터링

grep 커맨드로 디렉토리 안의 파일들을 검색할 때 바이너리 파일, 또는 크기가 큰 일부 파일들은 검색 대상에서 제외할 필요가 있습니다. 제외할 파일들은 --exclude, --include, --exclude-dir 플래그를 사용해서 필터링을 할 수 있습니다.

특정 디렉토리에서 확장자가 .bin 또는 .bak인 파일을 검색 대상에서 제외하려면 다음처럼 커맨드 플래그를 사용합니다.

grep --exclude=*.{bin,bak} -rn '찾는문자열' 대상경로

중괄호는 or 선택으로 앞의 커맨드는 대상 경로와 그 하위 경로에서 확장자가 *.bin, 또는 *.bak인 파일은 검색 대상에서 제외합니다.

제외할 확장자가 한개만 있을 때는 중괄호 없이 다음처럼 표현하면 됩니다.


디렉토리의 경우 --exclude-dir 매개변수를 사용하여 하나 이상의 디렉토리를 제외할 수 있습니다. 예를 들어, 이는 dir1/, dir2/ 및 *.dst/와 일치하는 모든 항목을 제외합니다.

grep --exclude=*.bak -rn '찾는문자열' 대상경로

대상 디렉토리의 하위 디렉토리들 중 일부를 검색 대상에서 제외하려면 다음처럼 디렉토리 이름으로 플래그를 작성할 수 있습니다. 디렉토리를 제외할 때는 "--exclude-dir" 플래그를 사용해야 합니다.

grep --exclude-dir={subdir1,subdir2,*.exe} -rnw '찾는문자열' 대상경로

이 grep 커맨드는 대상경로 디렉토리 하위의 subdir1, subdir2 디렉토리를 검색 대상에서 제외하며, 확장자가 exe인 파일도 검색 대상에서 제외합니다.

--exclude-dir 플래그는 디렉토리와 파일 필터를 모두 표시할 수 있습니다.