ripgrep est un outil de recherche orienté ligne qui recherche de manière récursive dans le répertoire actuel un modèle d'expression régulière. Par défaut, ripgrep respectera les règles de gitignore et ignorera automatiquement les fichiers/répertoires cachés et les fichiers binaires. (Pour désactiver tous les filtrages automatiques par défaut, utilisez rg -uuu
.) ripgrep bénéficie d'un support de première classe sur Windows, macOS et Linux, avec des téléchargements binaires disponibles pour chaque version. ripgrep est similaire à d’autres outils de recherche populaires comme The Silver Searcher, ack et grep.
Double licence sous MIT ou UNLICENSE.
Veuillez consulter le CHANGELOG pour un historique des versions.
Cet exemple recherche dans l'intégralité de l'arborescence des sources du noyau Linux (après avoir exécuté make defconfig && make -j8
) [AZ]+_SUSPEND
, où toutes les correspondances doivent être des mots. Les timings ont été collectés sur un système doté d'un Intel i9-12900K 5,2 GHz.
N’oubliez pas qu’un seul benchmark n’est jamais suffisant ! Voir mon article de blog sur ripgrep pour une comparaison très détaillée avec plus de références et d'analyses.
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0,082s (1,00x) |
hypergrep | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0,167s (2,04x) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0,273s (3,34x) |
Le chercheur d'argent | ag -w '[AZ]+_SUSPEND' | 534 | 0,443s (5,43x) |
ugrep | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0,639s (7,82x) |
git grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0,727s (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,935s (35,94x) |
Voici un autre benchmark sur le même corpus que ci-dessus qui ignore les fichiers gitignore et recherche plutôt avec une liste blanche. Le corpus est le même que dans le benchmark précédent, et les drapeaux passés à chaque commande garantissent qu'elles font un travail équivalent :
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0,063s (1,00x) |
ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,607s (9,62x) |
Grep GNU | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,674s (10,69x) |
Nous allons maintenant passer à la recherche sur un seul gros fichier. Voici une comparaison directe entre ripgrep, ugrep et GNU grep sur un fichier mis en cache en mémoire (~ 13 Go, OpenSubtitles.raw.en.gz
, décompressé) :
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042s (1,00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1,339s (1,28x) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6,577s (6,31x) |
Dans le test ci-dessus, le passage de l'indicateur -n
(pour afficher les numéros de ligne) augmente les temps à 1.664s
pour ripgrep et 9.484s
pour GNU grep. Les temps ugrep ne sont pas affectés par la présence ou l'absence de -n
.
Méfiez-vous cependant des falaises de performances :
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1,053s (1,00x) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6,234s (5,92x) |
ugrep | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28,973s (27,51x) |
Et les performances peuvent chuter précipitamment dans tous les domaines lors de la recherche de modèles dans de gros fichiers sans aucune possibilité d'optimisation littérale :
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep | rg '[A-Za-z]{30}' | 6749 | 15,569s (1,00x) |
ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21,857s (1,40x) |
Grep GNU | 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) |
Enfin, un nombre élevé de correspondances a également tendance à améliorer les performances du tank et à atténuer les différences entre les outils (car les performances sont dominées par la rapidité avec laquelle on peut gérer une correspondance et non par l'algorithme utilisé pour détecter la correspondance, d'une manière générale) :
Outil | Commande | Nombre de lignes | Temps |
---|---|---|---|
Ripgrep | rg the | 83499915 | 6,948s (1,00x) |
ugrep | ugrep the | 83499915 | 11,721s (1,69x) |
Grep GNU | LC_ALL=C grep the | 83499915 | 15,217s (2,19x) |
.gitignore
/ .ignore
/ .rgignore
, il ne recherchera pas les fichiers cachés et il ne recherchera pas les fichiers binaires. Le filtrage automatique peut être désactivé avec rg -uuu
.rg -tpy foo
limite votre recherche aux fichiers Python et rg -Tjs foo
exclut les fichiers JavaScript de votre recherche. ripgrep peut apprendre de nouveaux types de fichiers avec des règles de correspondance personnalisées.grep
, telles que l'affichage du contexte des résultats de recherche, la recherche de plusieurs modèles, la mise en évidence des correspondances avec de la couleur et la prise en charge complète d'Unicode. Contrairement à GNU grep, ripgrep reste rapide tout en prenant en charge Unicode (qui est toujours activé).-P/--pcre2
(utilisez toujours PCRE2) ou --auto-hybrid-regex
(utilisez PCRE2 uniquement si nécessaire). Une syntaxe alternative est fournie via l'option --engine (default|pcre2|auto)
.-E/--encoding
.)-z/--search-zip
.En d'autres termes, utilisez ripgrep si vous aimez la vitesse, le filtrage par défaut, moins de bugs et la prise en charge d'Unicode.
Bien qu'au départ il ne souhaitait pas ajouter toutes les fonctionnalités disponibles à ripgrep, au fil du temps, ripgrep a développé la prise en charge de la plupart des fonctionnalités trouvées dans d'autres outils de recherche de fichiers. Cela inclut la recherche de résultats s'étendant sur plusieurs lignes et la prise en charge optionnelle de PCRE2, qui fournit une prise en charge de la recherche et des références arrière.
À ce stade, les principales raisons de ne pas utiliser ripgrep sont probablement les suivantes :
En général, oui. Un grand nombre de benchmarks avec une analyse détaillée pour chacun sont disponibles sur mon blog.
En résumé, ripgrep est rapide car :
-P/--pcre2
.).gitignore
à l'aide d'un RegexSet
. Cela signifie qu'un seul chemin de fichier peut être comparé simultanément à plusieurs modèles globaux.crossbeam
et ignore
.Andy Lester, auteur de ack, a publié un excellent tableau comparant les fonctionnalités de ack, ag, git-grep, GNU grep et ripgrep : https://beyondgrep.com/feature-comparison/
Notez que ripgrep a récemment développé quelques nouvelles fonctionnalités importantes qui ne sont pas encore présentes dans le tableau d'Andy. Cela inclut, sans toutefois s'y limiter, les fichiers de configuration, le relais, la prise en charge de la recherche de fichiers compressés, la recherche multiligne et la prise en charge optionnelle des expressions régulières sophistiquées via PCRE2.
Si vous souhaitez essayer ripgrep avant de l'installer, il existe un terrain de jeu non officiel et un didacticiel interactif.
Si vous avez des questions à ce sujet, veuillez ouvrir un problème dans le référentiel du didacticiel.
Le nom binaire de ripgrep est rg
.
Des archives de binaires précompilés pour ripgrep sont disponibles pour Windows, macOS et Linux. Les binaires Linux et Windows sont des exécutables statiques. Il est conseillé aux utilisateurs de plateformes non explicitement mentionnées ci-dessous de télécharger l'une de ces archives.
Si vous êtes un utilisateur macOS Homebrew ou Linuxbrew , vous pouvez installer ripgrep à partir de homebrew-core :
$ brew install ripgrep
Si vous êtes un utilisateur MacPorts , vous pouvez installer ripgrep à partir des ports officiels :
$ sudo port install ripgrep
Si vous êtes un utilisateur de Windows Chocolatey , vous pouvez installer ripgrep à partir du dépôt officiel :
$ choco install ripgrep
Si vous êtes un utilisateur de Windows Scoop , vous pouvez installer ripgrep à partir du bucket officiel :
$ scoop install ripgrep
Si vous êtes un utilisateur Windows Winget , vous pouvez installer ripgrep à partir du référentiel winget-pkgs :
$ winget install BurntSushi.ripgrep.MSVC
Si vous êtes un utilisateur d'Arch Linux , vous pouvez installer ripgrep à partir des dépôts officiels :
$ sudo pacman -S ripgrep
Si vous êtes un utilisateur Gentoo , vous pouvez installer ripgrep à partir du dépôt officiel :
$ sudo emerge sys-apps/ripgrep
Si vous êtes un utilisateur Fedora , vous pouvez installer ripgrep à partir des référentiels officiels.
$ sudo dnf install ripgrep
Si vous êtes un utilisateur openSUSE , ripgrep est inclus dans openSUSE Tumbleweed et openSUSE Leap depuis 15.1.
$ sudo zypper install ripgrep
Si vous êtes un utilisateur RHEL/CentOS 7/8 , vous pouvez installer ripgrep depuis copr :
$ 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
Si vous êtes un utilisateur Nix , vous pouvez installer ripgrep depuis nixpkgs :
$ nix-env --install ripgrep
Si vous êtes un utilisateur Flox , vous pouvez installer ripgrep comme suit :
$ flox install ripgrep
Si vous êtes un utilisateur Guix , vous pouvez installer ripgrep à partir de la collection officielle de packages :
$ guix install ripgrep
Si vous êtes un utilisateur Debian (ou un utilisateur d'un dérivé de Debian comme Ubuntu ), alors ripgrep peut être installé à l'aide d'un fichier binaire .deb
fourni dans chaque version de 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
Si vous exécutez Debian stable, ripgrep est officiellement maintenu par Debian, bien que sa version puisse être plus ancienne que le paquet deb
disponible à l'étape précédente.
$ sudo apt-get install ripgrep
Si vous êtes un utilisateur d'Ubuntu Cosmic (18.10) (ou plus récent), ripgrep est disponible en utilisant le même packaging que Debian :
$ sudo apt-get install ripgrep
(NB : Divers snaps pour ripgrep sur Ubuntu sont également disponibles, mais aucun d'entre eux ne semble fonctionner correctement et génère un certain nombre de rapports de bogues très étranges que je ne sais pas comment corriger et que je n'ai pas le temps de corriger. Par conséquent, ce n'est plus une option d'installation recommandée.)
Si vous êtes un utilisateur ALT , vous pouvez installer ripgrep à partir du dépôt officiel :
$ sudo apt-get install ripgrep
Si vous êtes un utilisateur FreeBSD , vous pouvez installer ripgrep à partir des ports officiels :
$ sudo pkg install ripgrep
Si vous êtes un utilisateur d'OpenBSD , vous pouvez installer ripgrep à partir des ports officiels :
$ doas pkg_add ripgrep
Si vous êtes un utilisateur NetBSD , vous pouvez installer ripgrep depuis pkgsrc :
$ sudo pkgin install ripgrep
Si vous êtes un utilisateur Haiku x86_64 , vous pouvez installer ripgrep à partir des ports officiels :
$ sudo pkgman install ripgrep
Si vous êtes un utilisateur Haiku x86_gcc2 , vous pouvez installer ripgrep à partir du même port que Haiku x86_64 en utilisant la version d'architecture secondaire x86 :
$ sudo pkgman install ripgrep_x86
Si vous êtes un utilisateur de Void Linux , vous pouvez installer ripgrep à partir du référentiel officiel :
$ sudo xbps-install -Syv ripgrep
Si vous êtes un programmeur Rust , ripgrep peut être installé avec cargo
.
strip
sur le binaire. $ cargo install ripgrep
Alternativement, on peut utiliser cargo binstall
pour installer un binaire ripgrep directement depuis GitHub :
$ cargo binstall ripgrep
ripgrep est écrit en Rust, vous devrez donc récupérer une installation Rust afin de la compiler. ripgrep se compile avec Rust 1.72.0 (stable) ou plus récent. En général, ripgrep suit la dernière version stable du compilateur Rust.
Pour créer Ripgrep :
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
REMARQUE : dans le passé, ripgrep prenait en charge une fonctionnalité simd-accel
Cargo lors de l'utilisation d'un compilateur nocturne Rust. Cela n’a profité qu’au transcodage UTF-16. Puisqu’il nécessitait des fonctionnalités instables, ce mode de construction était sujet à la casse. Pour cette raison, sa prise en charge a été supprimée. Si vous souhaitez des optimisations SIMD pour le transcodage UTF-16, vous devrez alors demander au projet encoding_rs
d'utiliser des API stables.
Enfin, le support optionnel de PCRE2 peut être construit avec ripgrep en activant la fonctionnalité pcre2
:
$ cargo build --release --features 'pcre2'
L'activation de la fonctionnalité PCRE2 fonctionne avec un compilateur Rust stable et tentera de trouver et de créer automatiquement une liaison avec la bibliothèque PCRE2 de votre système via pkg-config
. S'il n'en existe pas, ripgrep construira PCRE2 à partir des sources à l'aide du compilateur C de votre système, puis le liera statiquement à l'exécutable final. La liaison statique peut être forcée même lorsqu'une bibliothèque système PCRE2 est disponible en créant ripgrep avec la cible MUSL ou en définissant PCRE2_SYS_STATIC=1
.
ripgrep peut être construit avec la cible MUSL sous Linux en installant d'abord la bibliothèque MUSL sur votre système (consultez votre gestionnaire de paquets convivial de quartier). Ensuite, il vous suffit d'ajouter le support MUSL à votre chaîne d'outils Rust et de reconstruire ripgrep, ce qui donne un exécutable entièrement statique :
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
L'application de l'indicateur --features
ci-dessus fonctionne comme prévu. Si vous souhaitez créer un exécutable statique avec MUSL et PCRE2, vous devrez alors installer musl-gcc
, qui peut se trouver dans un package distinct de la bibliothèque MUSL réelle, en fonction de votre distribution Linux.
ripgrep est relativement bien testé, y compris à la fois les tests unitaires et les tests d'intégration. Pour exécuter la suite de tests complète, utilisez :
$ cargo test --all
à partir de la racine du référentiel.
rg --json
. Donc, tout ce que vous devez faire pour que cela fonctionne est rg --json pattern | delta
. Voir la section du manuel de delta sur grep pour plus de détails.Pour signaler une vulnérabilité de sécurité, veuillez contacter Andrew Gallant. La page de contact contient mon adresse e-mail et ma clé publique PGP si vous souhaitez envoyer un message crypté.
Ce qui suit est une liste des traductions connues de la documentation de ripgrep. Ceux-ci sont officieusement maintenus et peuvent ne pas être à jour.