ripgrep은 현재 디렉터리에서 정규식 패턴을 재귀적으로 검색하는 줄 기반 검색 도구입니다. 기본적으로 ripgrep은 gitignore 규칙을 존중하고 숨겨진 파일/디렉터리 및 바이너리 파일을 자동으로 건너뜁니다. (기본적으로 모든 자동 필터링을 비활성화하려면 rg -uuu
사용하십시오.) ripgrep은 Windows, macOS 및 Linux에서 최고 수준의 지원을 제공하며 모든 릴리스에 대해 바이너리 다운로드가 가능합니다. ripgrep은 The Silver Searcher, ack 및 grep과 같은 다른 인기 검색 도구와 유사합니다.
MIT 또는 UNLICENSE에 따라 이중 라이센스를 받았습니다.
릴리스 내역은 CHANGELOG를 참조하세요.
이 예에서는 전체 Linux 커널 소스 트리( make defconfig && make -j8
실행 후)에서 [AZ]+_SUSPEND
를 검색합니다. 여기서 일치하는 항목은 모두 단어여야 합니다. 타이밍은 Intel i9-12900K 5.2GHz 시스템에서 수집되었습니다.
단일 벤치마크로는 결코 충분하지 않다는 점을 기억하세요! 더 많은 벤치마크 및 분석과의 매우 자세한 비교를 보려면 ripgrep에 대한 내 블로그 게시물을 참조하세요.
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
ripgrep(유니코드) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0.082초 (1.00x) |
하이퍼그렙 | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0.167초(2.04x) |
자식 grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0.273초(3.34배) |
은수색자 | ag -w '[AZ]+_SUSPEND' | 534 | 0.443초(5.43x) |
유그레프 | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0.639초(7.82x) |
자식 grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0.727초(8.91x) |
git grep(유니코드) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2.670초(32.70배) |
확인 | ack -w '[AZ]+_SUSPEND' | 2677 | 2.935초(35.94배) |
gitignore 파일을 무시하고 대신 화이트리스트를 사용하여 검색하는 위와 동일한 자료에 대한 또 다른 벤치마크가 있습니다. 코퍼스는 이전 벤치마크와 동일하며 각 명령에 전달된 플래그는 해당 명령이 동일한 작업을 수행하는지 확인합니다.
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
립그렙 | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0.063초 (1.00x) |
유그레프 | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.607초(9.62배) |
GNU grep | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.674초(10.69배) |
이제 단일 대용량 파일 검색으로 이동하겠습니다. 다음은 메모리에 캐시된 파일(~13GB, OpenSubtitles.raw.en.gz
, 압축 해제)에 대한 ripgrep, ugrep 및 GNU grep 간의 직접적인 비교입니다.
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
ripgrep(유니코드) | rg -w 'Sherlock [AZ]w+' | 7882 | 1.042초 (1.00x) |
유그레프 | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1.339초(1.28배) |
GNU grep(유니코드) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6.577초(6.31배) |
위 벤치마크에서 -n
플래그(줄 번호 표시용)를 전달하면 시간이 ripgrep의 경우 1.664s
초, GNU grep의 경우 9.484s
늘어납니다. ugrep 시간은 -n
의 유무에 영향을 받지 않습니다.
하지만 성능 절벽에 주의하세요.
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
ripgrep(유니코드) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1.053초 (1.00x) |
GNU grep(유니코드) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6.234초(5.92배) |
유그레프 | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28.973초(27.51배) |
그리고 리터럴 최적화 기회 없이 큰 파일에서 패턴을 검색할 때 전반적으로 성능이 급격히 떨어질 수 있습니다.
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
립그렙 | rg '[A-Za-z]{30}' | 6749 | 15.569초 (1.00x) |
유그레프 | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857초(1.40x) |
GNU grep | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409초(2.08배) |
GNU grep(유니코드) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8분 30초 (32.74x) |
마지막으로, 높은 일치 횟수는 탱크 성능과 도구 간의 차이를 완화하는 경향이 있습니다(성능은 일반적으로 일치를 감지하는 데 사용되는 알고리즘이 아니라 일치를 처리할 수 있는 속도에 따라 결정되기 때문입니다).
도구 | 명령 | 줄 수 | 시간 |
---|---|---|---|
립그렙 | rg the | 83499915 | 6.948초 (1.00x) |
유그레프 | ugrep the | 83499915 | 11.721초(1.69배) |
GNU grep | LC_ALL=C grep the | 83499915 | 15.217초(2.19배) |
.gitignore
/ .ignore
/ .rgignore
파일에서 무시된 파일을 검색하지 않으며 숨겨진 파일도 검색하지 않으며 바이너리 파일도 검색하지 않습니다. rg -uuu
사용하면 자동 필터링을 비활성화할 수 있습니다.rg -tpy foo
검색을 Python 파일로 제한하고 rg -Tjs foo
검색에서 JavaScript 파일을 제외합니다. ripgrep은 사용자 정의 일치 규칙을 사용하여 새로운 파일 형식에 대해 가르칠 수 있습니다.grep
에 있는 많은 기능을 지원합니다. GNU grep과 달리 ripgrep은 유니코드(항상 켜져 있음)를 지원하면서 빠르게 유지됩니다.-P/--pcre2
(항상 PCRE2 사용) 또는 --auto-hybrid-regex
(필요한 경우에만 PCRE2 사용)를 사용하여 활성화할 수 있습니다. --engine (default|pcre2|auto)
옵션을 통해 대체 구문이 제공됩니다.-E/--encoding
플래그를 사용하여 구체적으로 지정해야 합니다.)-z/--search-zip
플래그를 사용하여 일반 형식(brotli, bzip2, gzip, lz4, lzma, xz 또는 zstandard)으로 압축된 파일 검색을 지원합니다.즉, 속도, 기본 필터링, 적은 버그 및 유니코드 지원을 원한다면 ripgrep을 사용하십시오.
처음에는 ripgrep에 모든 기능을 추가하고 싶지 않았지만 시간이 지남에 따라 ripgrep은 다른 파일 검색 도구에서 찾을 수 있는 대부분의 기능에 대한 지원을 확대했습니다. 여기에는 여러 줄에 걸친 결과 검색과 둘러보기 및 역참조 지원을 제공하는 PCRE2에 대한 옵트인 지원이 포함됩니다.
이 시점에서 ripgrep을 사용하지 않는 주된 이유는 아마도 다음 중 하나 이상으로 구성될 것입니다.
일반적으로 그렇습니다. 각각에 대한 자세한 분석이 포함된 수많은 벤치마크를 내 블로그에서 확인할 수 있습니다.
요약하면 ripgrep은 다음과 같은 이유로 빠릅니다.
-P/--pcre2
플래그를 사용하여 선택할 수 있습니다.)RegexSet
사용하여 .gitignore
파일에 무시 패턴을 적용합니다. 이는 단일 파일 경로가 여러 glob 패턴과 동시에 일치될 수 있음을 의미합니다.crossbeam
및 ignore
의 도움으로 잠금이 없는 병렬 재귀 디렉터리 반복자를 사용합니다.ack의 저자인 Andy Lester는 ack, ag, git-grep, GNU grep 및 ripgrep의 기능을 비교하는 훌륭한 표를 게시했습니다: https://beyondgrep.com/feature-comparison/
ripgrep은 최근 Andy의 테이블에는 아직 없는 몇 가지 중요한 새 기능을 추가했습니다. 여기에는 구성 파일, 패스스루, 압축 파일 검색 지원, 여러 줄 검색 및 PCRE2를 통한 옵트인 멋진 정규식 지원이 포함되지만 이에 국한되지는 않습니다.
설치하기 전에 ripgrep을 사용해 보고 싶다면 비공식 놀이터와 대화형 튜토리얼이 있습니다.
이에 대해 질문이 있는 경우 튜토리얼 저장소에서 문제를 열어주세요.
ripgrep의 바이너리 이름은 rg
입니다.
ripgrep용으로 미리 컴파일된 바이너리 아카이브는 Windows, macOS 및 Linux에서 사용할 수 있습니다. Linux 및 Windows 바이너리는 정적 실행 파일입니다. 아래에 명시적으로 언급되지 않은 플랫폼 사용자는 이러한 아카이브 중 하나를 다운로드하는 것이 좋습니다.
macOS Homebrew 또는 Linuxbrew 사용자인 경우 homebrew-core에서 ripgrep을 설치할 수 있습니다.
$ brew install ripgrep
MacPorts 사용자라면 공식 포트에서 ripgrep을 설치할 수 있습니다.
$ sudo port install ripgrep
Windows Chocolatey 사용자라면 공식 저장소에서 ripgrep을 설치할 수 있습니다.
$ choco install ripgrep
Windows Scoop 사용자인 경우 공식 버킷에서 ripgrep을 설치할 수 있습니다.
$ scoop install ripgrep
Windows Winget 사용자인 경우 Winget-pkgs 리포지토리에서 ripgrep을 설치할 수 있습니다.
$ winget install BurntSushi.ripgrep.MSVC
Arch Linux 사용자라면 공식 저장소에서 ripgrep을 설치할 수 있습니다.
$ sudo pacman -S ripgrep
Gentoo 사용자라면 공식 저장소에서 ripgrep을 설치할 수 있습니다:
$ sudo emerge sys-apps/ripgrep
Fedora 사용자라면 공식 리포지토리에서 ripgrep을 설치할 수 있습니다.
$ sudo dnf install ripgrep
openSUSE 사용자인 경우 ripgrep은 15.1부터 openSUSE Tumbleweed 및 openSUSE Leap 에 포함되어 있습니다.
$ sudo zypper install ripgrep
RHEL/CentOS 7/8 사용자인 경우 copr에서 ripgrep을 설치할 수 있습니다.
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
$ sudo yum 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.0/ripgrep_14.1.0-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.0-1_amd64.deb
Debian stable을 실행하는 경우 ripgrep은 Debian에서 공식적으로 유지 관리하지만 해당 버전은 이전 단계에서 사용 가능한 deb
패키지보다 오래되었을 수 있습니다.
$ sudo apt-get install ripgrep
Ubuntu Cosmic(18.10) (또는 최신) 사용자인 경우 Debian과 동일한 패키지를 사용하여 ripgrep을 사용할 수 있습니다.
$ sudo apt-get install ripgrep
(NB Ubuntu의 ripgrep에 대한 다양한 스냅도 사용할 수 있지만 그 중 어느 것도 제대로 작동하지 않는 것 같고 수정 방법을 모르고 수정할 시간이 없는 매우 이상한 버그 보고서가 많이 생성됩니다. 따라서, 더 이상 권장되는 설치 옵션이 아닙니다.)
ALT 사용자인 경우 공식 저장소에서 ripgrep을 설치할 수 있습니다.
$ sudo apt-get install ripgrep
FreeBSD 사용자라면 공식 포트에서 ripgrep을 설치할 수 있습니다.
$ sudo pkg install ripgrep
OpenBSD 사용자라면 공식 포트에서 ripgrep을 설치할 수 있습니다.
$ doas pkg_add ripgrep
NetBSD 사용자라면 pkgsrc에서 ripgrep을 설치할 수 있습니다:
$ sudo pkgin install ripgrep
Haiku x86_64 사용자라면 공식 포트에서 ripgrep을 설치할 수 있습니다.
$ sudo pkgman install ripgrep
Haiku x86_gcc2 사용자인 경우 x86 보조 아키텍처 빌드를 사용하여 Haiku x86_64와 동일한 포트에서 ripgrep을 설치할 수 있습니다.
$ sudo pkgman install ripgrep_x86
Void Linux 사용자라면 공식 저장소에서 ripgrep을 설치할 수 있습니다.
$ sudo xbps-install -Syv ripgrep
Rust 프로그래머 라면 cargo
과 함께 ripgrep을 설치할 수 있습니다.
strip
실행하십시오. $ cargo install ripgrep
또는 cargo binstall
사용하여 GitHub에서 직접 ripgrep 바이너리를 설치할 수 있습니다.
$ cargo binstall ripgrep
ripgrep은 Rust로 작성되었으므로 이를 컴파일하려면 Rust 설치를 가져와야 합니다. ripgrep은 Rust 1.72.0(안정) 이상으로 컴파일됩니다. 일반적으로 ripgrep은 Rust 컴파일러의 최신 안정 릴리스를 추적합니다.
ripgrep을 빌드하려면:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
참고: 과거에는 Rust 야간 컴파일러를 사용할 때 ripgrep이 simd-accel
Cargo 기능을 지원했습니다. 이는 UTF-16 트랜스코딩에만 도움이 되었습니다. 불안정한 기능이 필요했기 때문에 이 빌드 모드는 손상되기 쉬웠습니다. 이로 인해 이에 대한 지원이 제거되었습니다. UTF-16 트랜스코딩을 위한 SIMD 최적화를 원하는 경우, 안정적인 API를 사용하도록 encoding_rs
프로젝트에 청원해야 합니다.
마지막으로 pcre2
기능을 활성화하여 ripgrep으로 선택적 PCRE2 지원을 구축할 수 있습니다.
$ cargo build --release --features 'pcre2'
PCRE2 기능을 활성화하면 안정적인 Rust 컴파일러에서 작동하며 pkg-config
통해 시스템의 PCRE2 라이브러리를 자동으로 찾아서 연결하려고 시도합니다. 존재하지 않는 경우 ripgrep은 시스템의 C 컴파일러를 사용하여 소스에서 PCRE2를 빌드한 다음 이를 최종 실행 파일에 정적으로 연결합니다. MUSL 대상으로 ripgrep을 구축하거나 PCRE2_SYS_STATIC=1
설정하여 사용 가능한 PCRE2 시스템 라이브러리가 있는 경우에도 정적 연결을 강제할 수 있습니다.
ripgrep은 먼저 시스템에 MUSL 라이브러리를 설치하여 Linux에서 MUSL 대상으로 구축할 수 있습니다(친숙한 이웃 패키지 관리자에게 문의하세요). 그런 다음 Rust 툴체인에 MUSL 지원을 추가하고 ripgrep을 다시 빌드하면 완전히 정적 실행 파일이 생성됩니다.
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
위에서 --features
플래그를 적용하면 예상대로 작동합니다. MUSL 및 PCRE2를 사용하여 정적 실행 파일을 빌드하려면 musl-gcc
설치해야 합니다. 이는 Linux 배포판에 따라 실제 MUSL 라이브러리와 별도의 패키지에 있을 수 있습니다.
ripgrep은 단위 테스트와 통합 테스트를 모두 포함하여 상대적으로 잘 테스트되었습니다. 전체 테스트 스위트를 실행하려면 다음을 사용하십시오.
$ cargo test --all
저장소 루트에서.
rg --json
출력 형식을 지원하는 구문 강조 호출기입니다. 따라서 이를 작동시키기 위해 해야 할 일은 rg --json pattern | delta
. 자세한 내용은 grep에 대한 델타 매뉴얼 섹션을 참조하세요.보안 취약점을 보고하려면 Andrew Gallant에게 문의하세요. 암호화된 메시지를 보내려는 경우 연락처 페이지에 내 이메일 주소와 PGP 공개 키가 있습니다.
다음은 ripgrep 문서의 알려진 번역 목록입니다. 이는 비공식적으로 유지 관리되며 최신 상태가 아닐 수 있습니다.