ripgrep: 재귀적 정규 표현식 검색 도구
요약
ripgrep은 정규 표현식을 사용하여 디렉토리를 재귀적으로 검색하는 고성능 라인 기반 검색 도구입니다. .gitignore 규칙을 준수하며 다양한 OS를 지원하고, 기존의 grep이나 The Silver Searcher보다 압도적인 검색 속도를 제공합니다.
핵심 포인트
- 재귀적 정규 표현식 검색 지원
- .gitignore 및 숨겨진 파일 자동 필터링
- Windows, macOS, Linux 멀티 플랫폼 지원
- 기존 검색 도구 대비 매우 빠른 성능(벤치마크 결과)
- MIT 및 UNLICENSE 이중 라이선스
ripgrep은 현재 디렉토리를 따라 재귀적으로 이동하며 정규 표현식(regex pattern)을 검색하는 라인 기반 검색 도구입니다. 기본적으로 ripgrep은 .gitignore 규칙을 준수하고 숨겨진 파일/디렉토리 및 바이너리 파일을 자동으로 건너뜁니다. (모든 자동 필터링 기능을 비활성화하려면 rg -uuu를 사용하세요.)
ripgrep은 Windows, macOS, Linux에서 1급 지원(first class support)을 제공하며, 모든 릴리스에 대해 바이너리 다운로드가 가능합니다. ripgrep은 The Silver Searcher, ack, grep과 같은 다른 인기 검색 도구들과 유사합니다.
MIT 또는 UNLICENSE 하에 이중 라이선스(Dual-licensed)됩니다.
릴리스 기록은 CHANGELOG를 참조하세요.
- 설치 (Installation)
- 사용자 가이드 (User Guide)
- 자주 묻는 질문 (Frequently Asked Questions)
- 정규 표현식 구문 (Regex syntax)
- 설정 파일 (Configuration files)
- 쉘 완성 기능 (Shell completions)
- 빌드 (Building)
- 번역 (Translations)
이 예시는 전체 Linux 커널 소스 트리(make defconfig && make -j8 실행 후)를 검색하여 '모든 일치 항목은 단어여야 한다'는 조건 하에 [A-Z]+_SUSPEND 패턴을 찾습니다.
측정 시간은 Intel i9-12900K 5.2 GHz 시스템에서 수집되었습니다.
단일 벤치마크만으로는 충분하지다는 점을 기억하세요! 더 많은 벤치마크와 분석이 포함된 매우 상세한 비교는 ripgrep에 대한 제 블로그 게시물을 참조하십시오.
| 도구 (Tool) | 명령어 (Command) | 라인 수 (Line count) | 시간 (Time) |
|---|---|---|---|
| ripgrep (Unicode) | rg -n -w '[A-Z]+_SUSPEND' | 536 | 0.082s (1.00x) |
| hypergrep | hgrep -n -w '[A-Z]+_SUSPEND' | 536 | 0.167s (2.04x) |
| git grep | git grep -P -n -w '[A-Z]+_SUSPEND' | 536 | 0.273s (3.34x) |
| The Silver Searcher | ag -w '[A-Z]+_SUSPEND' | 534 | 0.443s (5.43x) |
| ugrep | ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND' | 536 | 0.639s (7.82x) |
| git grep | LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' | 536 | 0.727s (8.91x) |
| git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' | 536 | 2.670s (32.70x) |
| ack | ack -w '[A-Z]+_SUSPEND' | 2677 | 2.935s (35.94x) |
다음은 위와 동일한 코퍼스(corpus)를 사용하되, .gitignore 파일을 무시하고 대신 화이트리스트(whitelist)를 사용하여 검색하는 또 다른 벤치마크입니다. 코퍼스는 이전 벤치마크와 동일하며, 각 명령에 전달된 플래그(flag)는 도구들이 동일한 작업을 수행하도록 보장합니다.
| 도구 | 명령 | 라인 수 | 시간 |
|---|---|---|---|
| ripgrep | rg -uuu -tc -n -w '[A-Z]+_SUSPEND' | 447 | 0.063s (1.00x) |
| ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' | 447 | 0.607s (9.62x) |
| GNU grep | grep -E -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' | 447 | 0.674s (10.69x) |
이제 단일 대용량 파일 검색으로 넘어가겠습니다. 다음은 메모리에 캐싱된 파일(~13GB, OpenSubtitles.raw.en.gz 압축 해제됨)에 대한 ripgrep, ugrep, GNU grep의 직접적인 비교입니다.
| 도구 | 명령 | 라인 수 | 시간 |
|---|---|---|---|
| ripgrep (Unicode) | rg -w 'Sherlock [A-Z]\w+' | 7882 | 1.042s (1.00x) |
| ugrep | ugrep -w 'Sherlock [A-Z]\w+' | 7882 | 1.339s (1.28x) |
| GNU grep (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\w+' | 7882 | 6.577s (6.31x) |
위 벤치마크에서 -n 플래그(라인 번호 표시용)를 전달하면 ripgrep은 1.664s로, GNU grep은 9.484s로 시간이 증가합니다. ugrep의 시간은 -n의 유무에 영향을 받지 않습니다.
하지만 성능 절벽(performance cliffs)에 주의하십시오:
| 도구 | 명령 | 라인 수 | 시간 |
|---|---|---|---|
| ripgrep (Unicode) | rg -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 1.053s (1.00x) |
| GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 6.234s (5.92x) |
| ugrep | ugrep -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 28.973s (27.51x) |
또한, 리터럴 최적화(literal optimizations)를 수행할 기회가 없는 패턴으로 큰 파일을 검색할 때는 전반적으로 성능이 급격히 떨어질 수 있습니다.
| 도구 | 명령어 | 라인 수 | 시간 |
|---|---|---|---|
| ripgrep | rg '[A-Za-z]{30}' | 6749 | 15.569s (1.00x) |
| ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857s (1.40x) |
| GNU grep | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409s (2.08x) |
| GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8m30s (32.74x) |
마지막으로, 매치(match) 횟수가 많으면 성능이 급격히 떨어지는 동시에 도구 간의 성능 차이가 줄어드는 경향이 있습니다 (일반적으로 말해서, 성능이 매치를 탐지하는 데 사용되는 알고리즘보다는 매치된 결과를 얼마나 빨리 처리할 수 있는지에 의해 좌우되기 때문입니다):
| 도구 | 명령어 | 라인 수 | 시간 |
|---|---|---|---|
| ripgrep | rg the | 83499915 | 6.948s (1.00x) |
| ugrep | ugrep the | 83499915 | 11.721s (1.69x) |
| GNU grep | LC_ALL=C grep the | 83499915 | 15.217s (2.19x) |
- ripgrep은 대부분의 기능을 포함하고 있으며 일반적으로 더 빠르기 때문에, 다른 검색 도구들이 제공하는 많은 사용 사례를 대체할 수 있습니다. (ripgrep이 실제로 grep을 대체할 수 있는지에 대한 자세한 내용은 FAQ를 참조하세요.)
- 코드 검색에 특화된 다른 도구들과 마찬가지로, ripgrep은 기본적으로 재귀적 검색 (recursive search)을 수행하며 자동 필터링 (automatic filtering)을 적용합니다. 즉, ripgrep은
.gitignore,.ignore,.rgignore파일에 의해 무시된 파일은 검색하지 않으며, 숨겨진 파일이나 바이너리 (binary) 파일도 검색하지 않습니다. 자동 필터링은rg -uuu명령어로 비활성화할 수 있습니다. - ripgrep은 특정 유형의 파일을 검색할 수 있습니다. 예를 들어,
rg -tpy foo는 검색 범위를 Python 파일로 제한하며,rg -Tjs foo는 검색에서 JavaScript 파일을 제외합니다. ripgpeg은 사용자 정의 매칭 규칙을 통해 새로운 파일 유형을 학습할 수 있습니다. - ripgrep은
grep에서 발견되는 많은 기능들을 지원합니다.
, 예를 들어 검색 결과의 문맥(context) 표시, 여러 패턴 검색, 색상을 이용한 매칭 하이라이트 및 완전한 유니코드(Unicode) 지원 등이 있습니다. GNU grep과 달리, ripgrep은 유니코드(항상 활성화됨)를 지원하면서도 빠른 속도를 유지합니다. - ripgrep은 정규 표현식 엔진(regex engine)을 PCRE2로 전환하여 사용할 수 있는 선택적 지원을 제공합니다.
이 기능은 무엇보다도 ripgrep의 기본 정규 표현식 엔진에서는 지원되지 않는 전방/후방 탐색(look-around) 및 역참조(backreferences)를 패턴에서 사용할 수 있게 해줍니다. PCRE2 지원은 -P/--pcre2 (항상 PCRE2 사용) 또는 --auto-hybrid-regex (필요한 경우에만 PCRE2 사용) 옵션으로 활성화할 수 있습니다. 대안적인 구문은 --engine (default|pcre2|auto) 옵션을 통해 제공됩니다. - ripgrep은 매칭된 내용에 따라 출력을 다시 작성할 수 있는 치환(replacements)에 대한 기본적인 지원을 제공합니다.
- ripgrep은 UTF-8 이외의 텍스트 인코딩(text encodings)으로 된 파일 검색을 지원합니다. 예를 들어 UTF-16, latin-1, GBK, EUC-JP, Shift_JIS 등이 있습니다. (UTF-16을 자동으로 감지하는 기능이 일부 제공됩니다. 그 외의 텍스트 인코딩은
-E/--encoding플래그를 통해 명시적으로 지정해야 합니다.) - ripgrep은-z/--search-zip플래그를 사용하여 일반적인 형식(brotli, bzip2, gzip, lz4, lzma, xz 또는 zstandard)으로 압축된 파일을 검색하는 것을 지원합니다. - ripgrep은 PDF 텍스트 추출, 지원 범위가 적은 압축 해제, 복호화, 자동 인코딩 감지 등을 포함한 임의의 입력 전처리 필터(input preprocessing filters)를 지원합니다. - ripgrep은 설정 파일(configuration file)을 통해 구성할 수 있습니다.
다시 말해, 속도, 기본 필터링, 적은 버그, 그리고 유니코드 지원을 선호한다면 ripgrep을 사용하십시오.
초기에는 세상의 모든 기능을 ripgrep에 추가하고 싶지 않았으나, 시간이 흐르면서 ripgrep은 다른 파일 검색 도구에서 발견되는 대부분의 기능에 대한 지원을 확장해 왔습니다. 여기에는 여러 줄에 걸친 결과 검색과 전방/후방 탐색 및 역참조 지원을 제공하는 선택적 PCRE2 지원이 포함됩니다.
현 시점에서 ripgrep을 사용하지 않는 주요 이유는 아마도 다음 중 하나 이상일 것입니다:
- 휴대 가능하고 어디에나 있는 (ubiquitous) 도구가 필요한 경우입니다. ripgrep은 Windows, macOS, Linux에서 작동하지만, 어디에나 존재하지는 않으며 POSIX와 같은 표준을 준수하지도 않습니다. 이 작업에 가장 적합한 도구는 오래된 grep입니다.
- 이 README에 나열되지 않은 다른 도구에는 있지만 ripgrep에는 없는 기능(또는 버그)이 여전히 필요한 경우입니다.
- 다른 도구는 잘 수행하지만 ripgrep은 성능상 불리한 특정 예외 상황(edge case)이 있는 경우입니다. (버그 리포트를 제출해 주세요!)
- 사용자의 머신에 ripgrep을 설치할 수 없거나 사용자의 플랫폼에서 사용할 수 없는 경우입니다. (버그 리포트를 제출해 주세요!)
일반적으로 그렇습니다. 각 항목에 대한 상세한 분석을 포함한 수많은 벤치마크 결과가 제 블로그에 공개되어 있습니다.
요약하자면, ripgrep이 빠른 이유는 다음과 같습니다:
- Rust의 정규 표현식 엔진 (regex engine)을 기반으로 구축되었기 때문입니다. Rust의 정규 표현식 엔진은 유한 오토마타 (finite automata), SIMD, 그리고 공격적인 리터럴 최적화 (literal optimizations)를 사용하여 검색을 매우 빠르게 만듭니다. (
-P/--pcre2플래그를 통해 PCRE2 지원을 선택할 수 있습니다.) - Rust의 정규 표현식 라이브러리는 결정적 유한 오토마타 (deterministic finite automaton) 엔진에 UTF-8 디코딩을 직접 구축함으로써, 완전한 유니코드 (Unicode) 지원을 유지하면서도 성능을 유지합니다.
- 메모리 맵 (memory maps)을 사용한 검색 또는 중간 버퍼를 사용한 점진적 (incrementally) 검색을 모두 지원합니다. 전자는 단일 파일에 더 적합하고, 후자는 대규모 디렉토리에 더 적합합니다. ripgrep은 사용자에게 가장 적합한 검색 전략을 자동으로 선택합니다.
RegexSet을 사용하여.gitignore파일의 무시 패턴 (ignore patterns)을 적용합니다. 이는 단일 파일 경로가 여러 글로브 패턴 (glob patterns)에 대해 동시에 매칭될 수 있음을 의미합니다.crossbeam과ignore덕분에 락 프리 (lock-free) 병렬 재귀 디렉토리 반복자 (parallel recursive directory iterator)를 사용합니다.
ack의 저자인 Andy Lester는 ack, ag, git-grep, GNU grep 및 ripgrep의 기능을 비교한 훌륭한 표를 게시했습니다: https://beyondgrep.com/feature-comparison/
ripgrep에는 최근 Andy의 표에는 아직 포함되지 않은 몇 가지 중요한 새로운 기능들이 추가되었습니다. 여기에는 설정 파일 (configuration files), passthru, 압축 파일 검색 지원, 다중 행 검색 (multiline search), 그리고 PCRE2를 통한 선택적 고급 정규 표현식 (fancy regex) 지원 등이 포함되지만 이에 국한되지는 않습니다.
설치하기 전에 ripgrep을 사용해보고 싶다면, 비공식 플레이그라운드 (playground)와 대화형 튜토리얼 (interactive tutorial)이 준비되어 있습니다.
이에 대해 궁금한 점이 있다면 튜토리얼 리포지토리 (repo)에 이슈 (issue)를 생성해 주세요.
ripgrep의 바이너리 (binary) 이름은 rg 입니다.
ripgrep의 사전 컴파일된 바이너리 (precompiled binaries) 아카이브는 Windows, macOS 및 Linux용으로 제공됩니다. Linux 및 Windows 바이너리는 정적 실행 파일 (static executables)입니다. 아래에 명시적으로 언급되지 않은 플랫폼의 사용자는 이 아카이브 중 하나를 다운로드할 것을 권장합니다.
macOS Homebrew 또는 Linuxbrew 사용자라면, homebrew-core를 통해 ripgrep을 설치할 수 있습니다:
$ brew install ripgrep
MacPorts 사용자라면, 공식 포트 (ports)에서 ripgrep을 설치할 수 있습니다:
$ sudo port install ripgrep
Windows Chocolatey 사용자라면, 공식 리포지토리 (repo)에서 ripgrep을 설치할 수 있습니다:
$ choco install ripgrep
Windows Scoop 사용자라면, 공식 버킷 (bucket)에서 ripgrep을 설치할 수 있습니다:
$ scoop install ripgrep
Windows Winget 사용자라면, winget-pkgs 리포지토리에서 ripgrep을 설치할 수 있습니다:
$ winget install BurntSushi.ripgrep.MSVC
Arch Linux 사용자라면, 공식 리포지토리 (repos)에서 ripgrep을 설치할 수 있습니다:
$ sudo pacman -S ripgrep
Gentoo 사용자라면, 공식 리포지토리 (repo)에서 ripgrep을 설치할 수 있습니다:
$ sudo emerge sys-apps/ripgrep
Fedora 사용자라면, 공식 리포지토리 (repositories)에서 ripgrep을 설치할 수 있습니다.
$ sudo dnf install ripgrep
openSUSE 사용자라면, ripgrep은 15.1 버전부터 openSUSE Tumbleweed 및 openSUSE Leap에 포함되어 있습니다.
$ sudo zypper install ripgrep
만약 CentOS Stream 10 사용자인 경우, EPEL 저장소에서 ripgrep을 설치할 수 있습니다:
$ sudo dnf config-manager --set-enabled crb
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
만약 Red Hat 10 사용자인 경우, EPEL 저장소에서 ripgrep을 설치할 수 있습니다:
$ sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
만약 Rocky Linux 10 사용자인 경우, EPEL 저장소에서 ripgrep을 설치할 수 있습니다:
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
만약 Nix 사용자인 경우, nixpkgs에서 ripgrep을 설치할 수 있습니다:
$ nix-env --install ripgrep
만약 Flox 사용자인 경우, 다음과 같이 ripgrep을 설치할 수 있습니다:
$ flox install ripgrep
만약 Guix 사용자인 경우, 공식 패키지 컬렉션에서 ripgrep을 설치할 수 있습니다:
$ guix install ripgrep
만약 Debian 사용자(또는 Ubuntu와 같은 Debian 파생 배포판 사용자)인 경우, 각 ripgrep 릴리스에 제공되는 바이너리 .deb 파일을 사용하여 ripgrep을 설치할 수 있습니다.
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep_14.1.1-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.1-1_amd64.deb
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Rust (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기