대부분의 검색 도구는 기본적으로 파일 이름만 살펴볼 뿐, 파일 내용은 확인하지 않습니다. 하지만 가장 유명한 GNU 검색 프로그램인 grep은 적절한 옵션을 사용하면 파일 내부까지 검색할 수 있습니다. 이번 글에서는 리눅스에서 파일 안에서 특정 단어를 찾는 다양한 방법을 소개합니다.
grep으로 파일 내 특정 단어 찾기

grep은 기본적으로 파일 이름뿐 아니라 파일 내용도 함께 검색합니다. 대부분의 리눅스 시스템에 기본 탑재되어 있으며, 배포판 간에도 거의 동일하게 작동합니다. 다만 사양이 낮은 리눅스 장비에서는 ack처럼 더 가벼운 명령어를 사용하는 편이 좋습니다.
파일 인코딩 방식에 따라 grep이 파일 내부를 읽지 못하는 경우도 있지만, 대부분의 텍스트 기반 형식에서는 지정한 패턴을 정상적으로 스캔할 수 있습니다.
grep -Rw '/path/to/search/' -e 'pattern'
-R 옵션은 grep을 재귀 모드로 설정해 지정된 디렉터리에 포함된 모든 하위 디렉터리까지 탐색합니다. -w 옵션은 단어 단위 전체 일치 검색을 수행합니다. 즉, 'red'는 공백 문자로 구분된 'red'와만 일치하며 'redundant'나 'tired'에는 일치하지 않습니다. -e 옵션은 검색할 패턴을 지정하며, 기본적으로 정규 표현식을 지원합니다.
grep의 속도를 높이려면 --exclude와 --include 옵션을 사용해 검색 범위를 특정 파일 형식으로 제한할 수 있습니다. 예를 들어 --exclude=*.csv는 .csv 확장자를 가진 파일을 검색에서 제외하고, 반대로 --include=*.txt는 .txt 확장자를 가진 파일만 검색합니다. 아래와 같이 grep 명령 바로 뒤에 옵션을 추가하면 됩니다.
grep --exclude=*.csv -Rw '/path/to/search' -e 'pattern'
특정 디렉터리를 제외하고 싶다면 아래 형식을 사용하세요.
grep --exclude-dir={dir1,dir2,*_old} -Rw '/path/to/search' -e 'pattern'
이 명령은 현재 작업 디렉터리에서 dir1, dir2 또는 *_old 패턴과 일치하는 디렉터리를 검색 대상에서 제외하고, 나머지 모든 파일에 대해 재귀적 단어 단위 검색을 실행합니다.
find로 파일 내 특정 단어 찾기

find 명령어는 문법이 grep보다 다소 복잡하지만, 이를 선호하는 사용자도 많습니다.
find . -name "*.php" -exec grep "pattern" {} \;
이 명령은 find의 -exec 옵션을 활용해 찾아낸 파일을 grep에 전달하여 검색합니다. 문법을 잘 조합하면 find의 빠른 파일 시스템 검색으로 원하는 파일 형식을 먼저 걸러낸 뒤, 해당 파일들을 grep으로 넘겨 파일 내용을 검색할 수 있습니다.
단, find 자체는 파일 이름만 확인할 뿐 내용은 살펴보지 않으므로, 파일의 텍스트와 내용을 검색하려면 grep이 반드시 필요합니다. 일반적인 grep 옵션들은 -exec 옵션 안에서도 그대로 사용할 수 있습니다.
ack로 파일 내 특정 단어 찾기
ack 명령어는 아마 가장 빠른 검색 도구 중 하나지만, 앞서 소개한 도구들만큼 널리 알려져 있지는 않습니다. 아래 명령은 현재 디렉터리 내부를 검색합니다.
ack 'pattern'
특정 파일이나 디렉터리를 검색하려면 검색어 뒤에 해당 파일명 또는 전체 경로를 붙이면 됩니다.
ack 'pattern' /path/to/file.txt
마무리
대부분의 상황에서 grep은 가장 폭넓게 사용할 수 있는 최고의 검색 도구입니다. 더 빠른 검색 성능이 필요하다면 RipGrep 같은 다른 검색 도구도 함께 살펴보세요.