ripgrep: grep의 고성능 대안

[원본 링크]

grep은 Unix에서 가장 널리 사용되는 파일 탐색 도구다.
하지만 일반적이고 기본적인 도구라고 해서 빠르다는 보장은 없다. grep이 그 경우에 속한다.
ripgrep은 고질적인 성능 한계를 해소하기 위해 나온 도구다.




Grep의 문제

grep은 켄 톰슨이 유닉스 초창기에 만든 고대유물인데, 프로그램 자체의 성능에는 문제가 없다.
문제는, 그때와 지금의 환경이 많이 달라졌다는 것이다.

해봤다면 알겠지만, grep으로 전체 파일 탐색을 하면 비정상적으로 오래걸릴 경우가 많다. grep은 텍스트파일을 전부 읽으면서 무한한 루프를 돌기 때문이다.

옛날에는 파일이 그렇게 많지도 않고, 종속성도 대부분 바이너리라서 괜찮았지만, 지금은 말이 좀 많이 달라졌다. 자바스크립트나 perl, python, ruby 같은 텍스트 형태의 스크립트 무더기들이 사방에 지뢰처럼 심어져있기 때문이다. 이런 것들이 grep의 탐색 성능을 극심하게 저하시킨다.




ripgrep의 목표

순수하게 빠른 탐색을 가능하게 하는 것이다. 여기에는 몇가지 방법이 있다.

**순수한 최적화 수준 **
SIMD 및 향상된 리터럴 처리 알고리즘을 사용해서 탐색 성능을 끌어올린다.

불필요한 파일 SKIP
ripgrep은 아주 간단한 논리를 사용해서 전체 스캔에서 발생하는 부하를 줄인다. 바이너리나 숨김 파일을 그냥 과감하게 검색 대상에서 빼버리는 것이다.
그래서 ripgrep은 .gitigore, .rgignore 같은 ignore 계열 파일도 읽어서 거기에 들어있는건 과감하게 무시해버린다. 이 때문에 의도치 않은 부작용이 발생할 수도 있긴 하지만, 대체로는 node_modules 같은 불필요하게 비대한 파일이 더 많으므로 실보다 득이 더 크다.




설치

대부분의 주요 패키지매니저에서 사전 빌드 패키지가 제공된다. 그냥 깔면 된다.

brew install ripgrep # MacOS 
sudo pacman -Sy ripgrep # Arch Linux

https://github.com/burntsushi/ripgrep?tab=readme-ov-file#installation

설치가 된다면 rg라는 명령으로 실행 가능해진다.




기본 사용법

rg는 기본적으로 정규식 기반으로 파일을 검색한다.
만약 _SUSPEND라는 텍스트가 포함된 것을 찾으려면, 다음과 같이 쿼리를 날릴 수 있다.

rg "검색 패턴" 검색 경로

-n은 라인 번호를 표시하는 옵션이고, -w은 exact word 패칭을 위한 옵션이다. 이게 또 나름 형태소를 분석해서 다른 단어의 형태를 거르는 기능도 있다.


만약 숨김 파일과 ignore에 등록된 파일까지 다 찾고 싶다면, 위와 같이 플래그를 주면 된다.


특정 파일 포맷만 필터링해서 볼 수도 있다. 위 플래그는 rust 코드만 찾는다.

-w word match는 상당히 강력한 기능 중 하나다.
그냥 function을 검색하면, 무식하게 그게 포함된 변형을 전부 찾는데

w를 넣으면 똑똑하게 진짜 그 단어만 찾아서 검색한다.



참조
https://burntsushi.net/ripgrep/
https://github.com/burntsushi/ripgrep
https://burntsushi.net/ripgrep/