ripgrep ist ein zeilenorientiertes Suchwerkzeug, das das aktuelle Verzeichnis rekursiv nach einem Regex-Muster durchsucht. Standardmäßig respektiert Ripgrep die Gitignore-Regeln und überspringt automatisch versteckte Dateien/Verzeichnisse und Binärdateien. (Um alle automatischen Filter standardmäßig zu deaktivieren, verwenden Sie rg -uuu
.) ripgrep bietet erstklassige Unterstützung für Windows, macOS und Linux, wobei für jede Version Binär-Downloads verfügbar sind. ripgrep ähnelt anderen beliebten Suchwerkzeugen wie The Silver Searcher, ack und grep.
Doppelt lizenziert unter MIT oder UNLICENSE.
Eine Veröffentlichungshistorie finden Sie im CHANGELOG.
In diesem Beispiel wird der gesamte Quellbaum des Linux-Kernels (nach dem Ausführen von make defconfig && make -j8
) nach [AZ]+_SUSPEND
durchsucht, wobei alle Übereinstimmungen Wörter sein müssen. Die Timings wurden auf einem System mit einem Intel i9-12900K 5,2 GHz erfasst.
Bitte denken Sie daran, dass ein einziger Benchmark nie ausreicht! Einen sehr detaillierten Vergleich mit weiteren Benchmarks und Analysen finden Sie in meinem Blog-Beitrag zu Ripgrep.
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
ripgrep (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0,082 s (1,00x) |
hypergrep | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0,167 s (2,04x) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0,273 s (3,34x) |
Der Silbersucher | ag -w '[AZ]+_SUSPEND' | 534 | 0,443 s (5,43x) |
ugrep | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0,639 s (7,82x) |
git grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0,727 s (8,91x) |
git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2,670s (32,70x) |
ack | ack -w '[AZ]+_SUSPEND' | 2677 | 2,935 s (35,94x) |
Hier ist ein weiterer Benchmark für denselben Korpus wie oben, der Gitignore-Dateien ignoriert und stattdessen mit einer Whitelist sucht. Der Korpus ist derselbe wie im vorherigen Benchmark, und die an jeden Befehl übergebenen Flags stellen sicher, dass sie gleichwertige Arbeit leisten:
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
ripgrep | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0,063 s (1,00x) |
ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,607 s (9,62x) |
GNU grep | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,674 s (10,69x) |
Jetzt gehen wir zur Suche nach einer einzelnen großen Datei über. Hier ist ein direkter Vergleich zwischen Ripgrep, Ugrep und GNU Grep für eine im Speicher zwischengespeicherte Datei (~13 GB, OpenSubtitles.raw.en.gz
, dekomprimiert):
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
ripgrep (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042 s (1,00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1,339 s (1,28x) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6,577 s (6,31x) |
Im obigen Benchmark erhöht die Übergabe des Flags -n
(zum Anzeigen von Zeilennummern) die Zeiten auf 1.664s
für Ripgrep und 9.484s
für GNU Grep. ugrep-Zeiten werden durch das Vorhandensein oder Fehlen von -n
nicht beeinflusst.
Achten Sie jedoch auf Leistungseinbußen:
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
ripgrep (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1,053 s (1,00x) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6,234 s (5,92x) |
ugrep | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28,973s (27,51x) |
Und die Leistung kann auf ganzer Linie drastisch sinken, wenn große Dateien nach Mustern durchsucht werden, ohne dass Möglichkeiten für buchstäbliche Optimierungen bestehen:
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
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,409 Sekunden (2,08x) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8:30 Minuten (32,74x) |
Schließlich tendieren hohe Trefferzahlen auch dazu, die Leistung zu beeinträchtigen und die Unterschiede zwischen den Tools auszugleichen (da die Leistung im Allgemeinen davon abhängt, wie schnell man mit einem Treffer umgehen kann, und nicht vom Algorithmus, der zum Erkennen des Treffers verwendet wird):
Werkzeug | Befehl | Zeilenanzahl | Zeit |
---|---|---|---|
ripgrep | rg the | 83499915 | 6,948s (1,00x) |
ugrep | ugrep the | 83499915 | 11,721 Sekunden (1,69x) |
GNU grep | LC_ALL=C grep the | 83499915 | 15,217 Sekunden (2,19x) |
.gitignore
-/ .ignore
-/ .rgignore
Dateien ignoriert werden, es durchsucht keine versteckten Dateien und es durchsucht keine Binärdateien. Die automatische Filterung kann mit rg -uuu
deaktiviert werden.rg -tpy foo
Ihre Suche auf Python-Dateien und rg -Tjs foo
schließt JavaScript-Dateien von Ihrer Suche aus. ripgrep kann mit benutzerdefinierten Abgleichsregeln über neue Dateitypen informiert werden.grep
enthaltene Funktionen, z. B. die Anzeige des Kontexts von Suchergebnissen, die Suche nach mehreren Mustern, die farbliche Hervorhebung von Übereinstimmungen und die vollständige Unicode-Unterstützung. Im Gegensatz zu GNU grep bleibt Ripgrep schnell und unterstützt gleichzeitig Unicode (das immer aktiviert ist).-P/--pcre2
(PCRE2 immer verwenden) oder --auto-hybrid-regex
(PCRE2 nur bei Bedarf verwenden) aktiviert werden. Eine alternative Syntax wird über die Option --engine (default|pcre2|auto)
bereitgestellt.-E/--encoding
angegeben werden.)-z/--search-zip
.Mit anderen Worten: Verwenden Sie ripgrep, wenn Sie Geschwindigkeit, Standardfilterung, weniger Fehler und Unicode-Unterstützung mögen.
Obwohl ripgrep ursprünglich nicht alle möglichen Funktionen zu Ripgrep hinzufügen wollte, unterstützt Ripgrep im Laufe der Zeit zunehmend die meisten Funktionen, die in anderen Dateisuchtools zu finden sind. Dazu gehört die Suche nach Ergebnissen, die sich über mehrere Zeilen erstrecken, sowie die Opt-in-Unterstützung für PCRE2, das Look-Around- und Backreference-Unterstützung bietet.
Zu diesem Zeitpunkt bestehen die Hauptgründe, Ripgrep nicht zu verwenden, wahrscheinlich in einem oder mehreren der folgenden Gründe:
Im Allgemeinen ja. Eine große Anzahl von Benchmarks mit detaillierten Analysen zu jedem ist auf meinem Blog verfügbar.
Zusammenfassend lässt sich sagen, dass Ripgrep schnell ist, weil:
-P/--pcre2
aktiviert werden.).gitignore
Dateien mithilfe eines RegexSet
an. Das bedeutet, dass ein einzelner Dateipfad gleichzeitig mit mehreren Glob-Mustern abgeglichen werden kann.crossbeam
ignore
.Andy Lester, Autor von ack, hat eine hervorragende Tabelle veröffentlicht, in der die Funktionen von ack, ag, git-grep, GNU grep und ripgrep verglichen werden: https://beyondgrep.com/feature-comparison/
Beachten Sie, dass Ripgrep in letzter Zeit um einige wichtige neue Funktionen erweitert wurde, die in Andys Tabelle noch nicht vorhanden sind. Dazu gehören unter anderem Konfigurationsdateien, Durchgang, Unterstützung für die Suche nach komprimierten Dateien, mehrzeilige Suche und Opt-in-Fancy-Regex-Unterstützung über PCRE2.
Wenn Sie Ripgrep vor der Installation ausprobieren möchten, gibt es einen inoffiziellen Spielplatz und ein interaktives Tutorial.
Wenn Sie Fragen dazu haben, öffnen Sie bitte ein Problem im Tutorial-Repo.
Der Binärname für Ripgrep ist rg
.
Archive vorkompilierter Binärdateien für Ripgrep sind für Windows, macOS und Linux verfügbar. Linux- und Windows-Binärdateien sind statische ausführbare Dateien. Nutzern von unten nicht explizit genannten Plattformen wird empfohlen, eines dieser Archive herunterzuladen.
Wenn Sie ein macOS Homebrew- oder ein Linuxbrew- Benutzer sind, können Sie Ripgrep vom Homebrew-Core aus installieren:
$ brew install ripgrep
Wenn Sie ein MacPorts -Benutzer sind, können Sie ripgrep von den offiziellen Ports installieren:
$ sudo port install ripgrep
Wenn Sie ein Windows Chocolatey- Benutzer sind, können Sie Ripgrep aus dem offiziellen Repo installieren:
$ choco install ripgrep
Wenn Sie ein Windows Scoop- Benutzer sind, können Sie ripgrep aus dem offiziellen Bucket installieren:
$ scoop install ripgrep
Wenn Sie ein Windows Winget- Benutzer sind, können Sie ripgrep aus dem Winget-Pkgs-Repository installieren:
$ winget install BurntSushi.ripgrep.MSVC
Wenn Sie ein Arch Linux- Benutzer sind, können Sie Ripgrep von den offiziellen Repos installieren:
$ sudo pacman -S ripgrep
Wenn Sie ein Gentoo- Benutzer sind, können Sie Ripgrep vom offiziellen Repo installieren:
$ sudo emerge sys-apps/ripgrep
Wenn Sie Fedora- Benutzer sind, können Sie Ripgrep aus offiziellen Repositories installieren.
$ sudo dnf install ripgrep
Wenn Sie ein openSUSE -Benutzer sind, ist Ripgrep seit 15.1 in openSUSE Tumbleweed und openSUSE Leap enthalten.
$ sudo zypper install ripgrep
Wenn Sie ein RHEL/CentOS 7/8- Benutzer sind, können Sie ripgrep von copr installieren:
$ 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
Wenn Sie ein Nix -Benutzer sind, können Sie ripgrep von nixpkgs installieren:
$ nix-env --install ripgrep
Wenn Sie ein Flox -Benutzer sind, können Sie ripgrep wie folgt installieren:
$ flox install ripgrep
Wenn Sie Guix -Benutzer sind, können Sie ripgrep aus der offiziellen Paketsammlung installieren:
$ guix install ripgrep
Wenn Sie ein Debian- Benutzer sind (oder ein Benutzer eines Debian-Derivats wie Ubuntu ), kann Ripgrep mithilfe einer binären .deb
Datei installiert werden, die in jeder Ripgrep-Version bereitgestellt wird.
$ 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
Wenn Sie Debian Stable ausführen, wird ripgrep offiziell von Debian verwaltet, obwohl seine Version möglicherweise älter ist als das im vorherigen Schritt verfügbare deb
Paket.
$ sudo apt-get install ripgrep
Wenn Sie ein Benutzer von Ubuntu Cosmic (18.10) (oder neuer) sind, ist ripgrep im gleichen Paket wie Debian verfügbar:
$ sudo apt-get install ripgrep
(Hinweis: Verschiedene Snaps für Ripgrep unter Ubuntu sind ebenfalls verfügbar, aber keiner davon scheint richtig zu funktionieren und generiert eine Reihe sehr seltsamer Fehlerberichte, die ich nicht beheben kann und für deren Behebung ich keine Zeit habe. Daher Dies ist keine empfohlene Installationsoption mehr.)
Wenn Sie ein ALT- Benutzer sind, können Sie ripgrep aus dem offiziellen Repo installieren:
$ sudo apt-get install ripgrep
Wenn Sie ein FreeBSD -Benutzer sind, können Sie ripgrep von den offiziellen Ports installieren:
$ sudo pkg install ripgrep
Wenn Sie ein OpenBSD -Benutzer sind, können Sie ripgrep von den offiziellen Ports installieren:
$ doas pkg_add ripgrep
Wenn Sie ein NetBSD -Benutzer sind, können Sie ripgrep von pkgsrc installieren:
$ sudo pkgin install ripgrep
Wenn Sie ein Haiku x86_64- Benutzer sind, können Sie Ripgrep von den offiziellen Ports installieren:
$ sudo pkgman install ripgrep
Wenn Sie ein Haiku x86_gcc2- Benutzer sind, können Sie ripgrep vom gleichen Port wie Haiku x86_64 installieren, indem Sie den x86-Sekundärarchitektur-Build verwenden:
$ sudo pkgman install ripgrep_x86
Wenn Sie ein Void-Linux- Benutzer sind, können Sie ripgrep aus dem offiziellen Repository installieren:
$ sudo xbps-install -Syv ripgrep
Wenn Sie ein Rust-Programmierer sind, kann Ripgrep mit cargo
installiert werden.
strip
in der Binärdatei aus. $ cargo install ripgrep
Alternativ kann man mit cargo binstall
eine Ripgrep-Binärdatei direkt von GitHub installieren:
$ cargo binstall ripgrep
ripgrep ist in Rust geschrieben, Sie müssen sich also eine Rust-Installation besorgen, um es zu kompilieren. ripgrep lässt sich mit Rust 1.72.0 (stabil) oder neuer kompilieren. Im Allgemeinen verfolgt ripgrep die neueste stabile Version des Rust-Compilers.
So erstellen Sie Ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
HINWEIS: In der Vergangenheit unterstützte Ripgrep eine simd-accel
-Cargo-Funktion bei Verwendung eines nächtlichen Rust-Compilers. Dies kam nur der UTF-16-Transkodierung zugute. Da instabile Funktionen erforderlich waren, war dieser Baumodus anfällig für Brüche. Aus diesem Grund wurde die Unterstützung dafür entfernt. Wenn Sie SIMD-Optimierungen für die UTF-16-Transkodierung wünschen, müssen Sie beim Projekt encoding_rs
eine Petition für die Verwendung stabiler APIs einreichen.
Schließlich kann optionale PCRE2-Unterstützung mit ripgrep erstellt werden, indem die pcre2
Funktion aktiviert wird:
$ cargo build --release --features 'pcre2'
Die Aktivierung der PCRE2-Funktion funktioniert mit einem stabilen Rust-Compiler und versucht, die PCRE2-Bibliothek Ihres Systems automatisch über pkg-config
zu finden und mit ihr zu verknüpfen. Wenn keines vorhanden ist, erstellt ripgrep PCRE2 mithilfe des C-Compilers Ihres Systems aus dem Quellcode und verknüpft es dann statisch mit der endgültigen ausführbaren Datei. Statische Verknüpfungen können auch dann erzwungen werden, wenn eine PCRE2-Systembibliothek verfügbar ist, indem entweder ripgrep mit dem MUSL-Ziel erstellt oder PCRE2_SYS_STATIC=1
festgelegt wird.
ripgrep kann mit dem MUSL-Ziel unter Linux erstellt werden, indem Sie zuerst die MUSL-Bibliothek auf Ihrem System installieren (wenden Sie sich an Ihren freundlichen Paketmanager in der Nachbarschaft). Dann müssen Sie nur noch MUSL-Unterstützung zu Ihrer Rust-Toolchain hinzufügen und ripgrep neu erstellen, was eine vollständig statische ausführbare Datei ergibt:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
Das Anwenden des Flags --features
von oben funktioniert wie erwartet. Wenn Sie eine statische ausführbare Datei mit MUSL und PCRE2 erstellen möchten, müssen Sie musl-gcc
installiert haben, das sich je nach Linux-Distribution möglicherweise in einem separaten Paket von der eigentlichen MUSL-Bibliothek befindet.
Ripgrep ist relativ gut getestet, einschließlich Unit-Tests und Integrationstests. Um die vollständige Testsuite auszuführen, verwenden Sie:
$ cargo test --all
aus dem Repository-Stammverzeichnis.
rg --json
unterstützt. Alles, was Sie also tun müssen, damit es funktioniert, ist rg --json pattern | delta
. Weitere Einzelheiten finden Sie im Delta-Handbuchabschnitt zu grep.Wenn Sie eine Sicherheitslücke melden möchten, wenden Sie sich bitte an Andrew Gallant. Auf der Kontaktseite finden Sie meine E-Mail-Adresse und meinen öffentlichen PGP-Schlüssel, wenn Sie eine verschlüsselte Nachricht senden möchten.
Im Folgenden finden Sie eine Liste bekannter Übersetzungen der Dokumentation von Ripgrep. Diese werden inoffiziell gepflegt und sind möglicherweise nicht aktuell.