grep ? Ripgrep? Le chercheur d'argent ? Quel outil est le meilleur pour rechercher du texte dans des fichiers ?
grep est l'outil établi pour la recherche de fichiers en texte intégral sur la ligne de commande. Mais des alternatives sont disponibles, comme ripgrep, ag et sift. Mais devriez-vous changer et, si oui, quel devrait être votre outil de recherche de prédilection ? Découvrons.
Sommaire
Comment fonctionne grep ?
grep est l'un des outils Linux les plus utiles disponibles, et ce depuis un demi-siècle. Son nom signifie Global Regular Expression Print, mais il s'agit en réalité d'après une ancienne commande ed : g/re/p. Cette commande est apte à rechercher du texte, notamment en utilisant le langage puissant des expressions régulières.
Vous pouvez commencer simplement, avec une recherche textuelle de base :
grep 'TODO' journal.md
Et, à terme, vous créerez des correspondances de motifs complexes :
grep -E "^((0-9){4})-((0-9){2})-((0-9){2})" dates.txt
Cet exemple montre la puissance brute de grep : il utilise des expressions régulières étendues pour faire correspondre les lignes commençant par une simple date ISO, comme 2025-10-26. Vous pouvez également utiliser grep dans vos pipelines, avec beaucoup d’effet. Par exemple, cette commande affichera les lignes d'un journal Apache, en temps réel, si le serveur a envoyé un statut « non modifié » :
tail -f /var/log/apache2/access_log | grep '" 304'
Et une dernière fonctionnalité intéressante de grep : la recherche récursive. L’exécution de « grep -r pattern » recherchera tous les fichiers dans votre répertoire actuel et ci-dessous, imprimant chaque résultat correspondant. Cela fait de grep un outil parfait pour rechercher des fichiers contenant le modèle de texte que vous devez rechercher :
grep -ri todo
Qu'est-ce que ripgrep fait mieux ?
grep est omniprésent et a peut-être fait plus que tout autre programme pour démontrer la puissance d'Unix : des programmes ciblés, travaillant en collaboration, communiquant par canalisation de données textuelles. Alors pourquoi chercher ailleurs ?
ripgrep est une alternative populaire et moderne à grep, et c'est l'une des meilleures mises à niveau d'une commande par défaut que vous puissiez effectuer. Vous pouvez l'installer avec un large éventail de gestionnaires de packages, en utilisant une commande telle que brasser installer ripgrep, sudo apt-get install ripgrep, sudo dnf installer ripgrepou la commande appropriée pour votre système. Une fois installé, vous l'exécuterez en tant que rg (et non ripgrep), en utilisant une approche similaire à grep. Par exemple, pour rechercher tous les titres d'un fichier markdown :
rg '^#' README.md
La première version de ripgrep est arrivée en 2016 et tirait parti du langage de programmation Rust relativement nouveau. De manière générale, grâce à une excellente optimisation du moteur d'expressions régulières de Rust, ripgrep est plus rapide que les alternatives, notamment grep, qui peut être jusqu'à dix fois plus lent.
Vous ne remarquerez peut-être pas ce type d’avantage en termes de vitesse lors d’une utilisation quotidienne. Mais si vous lancez des recherches de longue durée, en particulier récursives, sur de nombreux fichiers, avec des modèles plus complexes, ripgrep peut offrir de gros avantages. La recherche récursive est la recherche par défaut de ripgrep, à tel point que la commande suivante est tout ce dont vous avez besoin pour rechercher un modèle dans tous les fichiers à l'intérieur et au-dessous du répertoire actuel :
rg PATTERN
Pour un benchmark approximatif, j'ai effectué un test simple (non rigoureux) en utilisant un répertoire contenant environ 40 000 fichiers. La commande grep a pris 30 secondes, tandis que ripgrep a pris un peu moins d'une seconde. Désormais, ces résultats varieront sans aucun doute en fonction de plusieurs facteurs, mais ripgrep fonctionne définitivement mieux dans mon utilisation quotidienne.
L'une des raisons pour lesquelles ripgrep est si rapide est son modèle multithread, qui exécute une recherche récursive en parallèle. Un effet secondaire intéressant est que vous verrez (probablement) les résultats dans un ordre différent à chaque fois que vous exécuterez la même recherche. Si cela pose un problème, utilisez le –trier le chemin option.
Mais les avantages de ripgrep vont au-delà de la simple vitesse ; le programme dispose également d'un ensemble complet de fonctionnalités. L'une des plus simples est la prise en charge d'une gamme d'options de filtrage spécifiques à la langue, par exemple :
rg --type sh 'todo'
Cela effectuera une recherche récursive à partir du répertoire actuel, en recherchant uniquement dans les scripts shell le modèle « todo ». L'outil prend en charge une liste complète de types de fichiers, que vous pouvez afficher avec l'option –type-list :
La commande ripgrep est récursive par nature, mais même ce comportement peut être contrôlé à l'aide de l'option –max-deep. Exécutez simplement rg –max-profondeur 1 MOTIF et votre recherche émulera un grep de base, limité aux fichiers de votre répertoire actuel.
Conformément à de nombreux programmes modernes, ripgrep prend en charge git dans le sens où il lira un fichier .gitignore et ignorera les mêmes fichiers. Cela ne se produira qu'en mode récursif et il existe de nombreuses options de configuration pour vous permettre de modifier cette fonctionnalité.
ripgrep a beaucoup plus de fonctionnalités. Il peut ignorer les fichiers plus grands qu'une taille donnée (–max-filesize), afficher des informations récapitulatives (–stats), utiliser la recherche intelligente de casse (basée sur la casse des lettres de votre modèle) et rechercher dans les fichiers gzip.
Bien que grep soit fermement établi comme outil de recherche par défaut et que ripgrep soit l'alternative la plus populaire, il existe quelques autres programmes qui valent la peine d'être consultés.
ack
ack est un outil similaire, principalement compatible avec grep, écrit en Perl. Encore une fois, c'est récursif par défaut, ce qui est pratique. Il fonctionne également de la même manière que ripgrep, inspectant les fichiers qu'il reconnaît (par type) mais en ignorant les autres. Cependant, cela ne s'étend pas aux fichiers correspondant aux fichiers .gitignore, bien que ack ignorera tous les répertoires .git.
ack a une curieuse option -f qui imprime les chemins de tous les fichiers qu'il rechercherait, sans réellement les rechercher. Cela peut ne pas sembler très utile, mais vous pouvez exploiter les autres fonctionnalités d'ack, en l'utilisant pour imprimer une liste de tous les fichiers (un peu comme « find . ») ou de tous les fichiers d'un type donné. L'option fonctionnera en conjonction avec .gitignore, c'est donc un moyen utile de rechercher des fichiers dans un référentiel de code source.
D'après mon expérience, ack est plus rapide que grep, mais ce n'est pas aussi rapide que ripgrep.
Le chercheur d'argent
La commande ag exécute un programme appelé The Silver Searcher, qui joue sur l'expression « Silver Surfer » et fait référence au symbole chimique de l'argent.
ag est une alternative très solide à ripgrep. Ce n'est pas aussi rapide que rg dans mon utilisation, mais c'est presque le cas. La différence n'est pas telle que vous la remarqueriez à moins que vous n'exécutiez des tests d'analyse comparative ou que vous effectuiez des recherches très complexes.
Mais ag peut faire bon nombre des mêmes choses que rg : il honore les fichiers .gitignore, effectue des correspondances entre les nouvelles lignes, recherche dans les fichiers binaires et peut imprimer des statistiques récapitulatives.
Tamiser
Sift est encore un autre outil de recherche de texte, cette fois écrit en Go. C'est récursif par défaut, avec une option pour le désactiver. Alors que la sortie de rg regroupe les résultats par fichier, tamis imprime le chemin complet avant chaque correspondance. Cette approche sacrifie la lisibilité humaine au profit de la lisibilité machine, donc par défaut, cela peut être plus facile pour la création de scripts.
Comme ag, le tamisage est rapide, sinon aussi rapide que rg. Par défaut, il recherche autant de fichiers que possible, y compris les binaires et les fichiers mentionnés dans .gitignore. Cependant, vous pouvez ignorer l'un ou l'autre ensemble de fichiers en utilisant respectivement les options –binary-skip et –git.
Sift n'a pas de page de manuel, ce que je considère comme un défaut, bien qu'il fournisse des informations utiles avec l'option –help.
Si vous utilisez toujours grep, n'importe lequel de ces outils ressemblera à une mise à niveau importante. ripgrep est mon préféré car il semble si raffiné et sa longue liste de fonctionnalités permet de nombreux types différents de recherches puissantes. Sa vitesse, comparée à grep, doit être vue pour être crue.
C'est toujours agréable d'avoir des alternatives : un écosystème open source avec une saine concurrence devrait permettre d'obtenir de meilleurs logiciels à tous les niveaux. Cela dit, il y a peu de choses qui différencient ces outils pour une utilisation typique, autres que les langages dans lesquels ils sont programmés. ripgrep est certainement le plus rapide (juste) et est probablement votre meilleur choix, à moins que vous n'ayez besoin d'options très spécifiques.
La nouvelle rassurante est que ripgrep est toujours en développement actif, la dernière version 15.0.0 ayant été publiée en octobre. ack est toujours en cours de développement, avec un peu moins de fréquence, tandis que sift et ag ont pratiquement cessé d'être mis à jour.
