Recherche de site Web

Comment utiliser la commande Linux grep


Apprenez les bases de la recherche d'informations dans vos fichiers, puis téléchargez notre aide-mémoire pour un guide de référence rapide sur grep et regex.

L'une des commandes Unix classiques, développée en 1974 par Ken Thompson, est la commande Global Regular Expression Print (grep). Il est si omniprésent en informatique qu'il est fréquemment utilisé comme verbe (« parcourir un fichier ») et, selon le degré de geek de votre public, il s'intègre également parfaitement dans des scénarios du monde réel. (Par exemple, "Je devrai saisir mes banques de mémoire pour rappeler ces informations.") En bref, grep est un moyen de rechercher dans un fichier un modèle de caractères spécifique. Si cela ressemble à la fonction Rechercher moderne disponible dans n'importe quel traitement de texte ou éditeur de texte, alors vous avez déjà expérimenté les effets de grep sur l'industrie informatique.

Loin d'être simplement une vieille commande désuète qui a été supplantée par la technologie moderne, le véritable pouvoir de grep réside dans deux aspects :

  • Grep fonctionne dans le terminal et opère sur des flux de données, vous pouvez donc l'incorporer dans des processus complexes. Vous pouvez non seulement trouver un mot dans un fichier texte ; vous pouvez extraire le mot, l'envoyer à une autre commande, etc.
  • Grep utilise une expression régulière pour fournir une capacité de recherche flexible.

Apprendre la commande grep est facile, même si cela demande un peu de pratique. Cet article vous présente certaines de ses fonctionnalités que je trouve les plus utiles.

[Téléchargez notre aide-mémoire grep gratuite]

Installation de grep

Si vous utilisez Linux, grep est déjà installé.

Sur macOS, vous disposez de la version BSD de grep. Cela diffère légèrement de la version GNU, donc si vous souhaitez suivre exactement cet article, installez GNU grep à partir d'un projet comme Homebrew ou MacPorts.

Grep de base

La syntaxe de base de grep est toujours la même. Vous fournissez à la commande grep un modèle et un fichier dans lequel vous souhaitez qu'elle recherche. En retour, il imprime chaque ligne sur votre terminal avec une correspondance.

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Par défaut, la commande grep est sensible à la casse, donc « gnu » est différent de « GNU » ou « Gnu ». Vous pouvez lui faire ignorer les majuscules avec l'option --ignore-case.

$ grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Vous pouvez également faire en sorte que la commande grep renvoie toutes les lignes sans de correspondance en utilisant l'option --invert-match :

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

Tuyaux

Il est utile de pouvoir rechercher du texte dans un fichier, mais le véritable pouvoir de POSIX réside dans sa capacité à enchaîner des commandes via des « pipes ». Je trouve que ma meilleure utilisation de grep est lorsqu'il est combiné avec d'autres outils, comme cut, tr ou curl.

Par exemple, supposons que j'ai un fichier répertoriant certains documents techniques que je souhaite télécharger. Je pourrais ouvrir le fichier et cliquer manuellement sur chaque lien, puis cliquer sur les options de Firefox pour enregistrer chaque fichier sur mon disque dur, mais cela prend beaucoup de temps et de clics. Au lieu de cela, je pourrais récupérer les liens dans le fichier, en imprimant uniquement la chaîne correspondante en utilisant l'option --only-matching :

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

Le résultat est une liste d’URL, chacune sur une ligne. C'est un ajustement naturel à la façon dont Bash traite les données, donc au lieu d'imprimer les URL sur mon terminal, je peux simplement les rediriger vers curl :

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

Cela télécharge chaque fichier et l'enregistre en fonction de son nom de fichier distant sur mon disque dur.

Mon modèle de recherche dans cet exemple peut sembler énigmatique. C'est parce qu'il utilise une expression régulière, une sorte de langage « générique » particulièrement utile lors d'une recherche large dans un grand nombre de textes.

Expression régulière

Personne n’a l’illusion que l’expression régulière (« regex » en abrégé) est facile. Cependant, je trouve que sa réputation est souvent pire qu’elle ne le mérite. Certes, il est possible que les gens deviennent un peu trop intelligents avec les regex jusqu'à ce qu'ils soient si illisibles et si larges qu'ils se replient sur eux-mêmes, mais vous n'êtes pas obligé d'exagérer votre regex. Voici une brève introduction à l'expression régulière telle que je l'utilise.

Tout d'abord, créez un fichier appelé example.txt et saisissez-y ce texte :

Albania
Algeria
Canada
0
1
3
11

L'élément le plus basique de l'expression régulière est le humble caractère .. Il représente un seul personnage.

$ grep Can.da example.txt
Canada

Le modèle Can.da a renvoyé avec succès Canada car le caractère . représentait n'importe quel un caractère.

Le caractère générique . peut être modifié pour représenter plusieurs caractères avec ces notations :

  • ? correspond à l'élément précédent zéro ou une fois
  • * correspond à l'élément précédent zéro ou plusieurs fois
  • + correspond à l'élément précédent une ou plusieurs fois
  • {4} correspond à l'élément précédent quatre fois (ou à tout nombre que vous saisissez entre accolades)

Armé de ces connaissances, vous pouvez pratiquer les regex sur example.txt tout l'après-midi, pour voir quelles combinaisons intéressantes vous proposez. Certains ne fonctionneront pas ; d'autres le feront. L’important est d’analyser les résultats pour comprendre pourquoi.

L'expression régulière avancée nécessite l'option --extended-regexp ou -E.

Par exemple, cela ne renvoie aucun pays :

$ grep -E A.a example.txt

Cela échoue car le caractère . ne peut correspondre qu'à un seul caractère, à moins que vous ne l'augmentiez de niveau. En utilisant le caractère *, vous pouvez demander à grep de faire correspondre un seul caractère zéro ou autant de fois que nécessaire jusqu'à ce qu'il atteigne la fin du mot. Parce que vous connaissez la liste à laquelle vous avez affaire, vous savez que zéro fois est inutile dans ce cas. Il n’y a certainement aucun nom de pays à trois lettres dans cette liste. Ainsi, à la place, vous pouvez utiliser + pour faire correspondre un seul caractère au moins une fois, puis autant de fois que nécessaire jusqu'à la fin du mot :

$ grep -E A.+a example.txt
Albania
Algeria

Vous pouvez utiliser des crochets pour fournir une liste de lettres :

$ grep -E [AC].+a example.txt
Albania
Algeria
Canada

Cela fonctionne également pour les chiffres. Les résultats pourraient vous surprendre:

$ grep [1-9] example.txt
1
3
11

Êtes-vous surpris de voir 11 dans une recherche des chiffres 1 à 9 ?

Que se passe-t-il si vous en ajoutez 13 à votre liste ?

Ces nombres sont renvoyés car ils incluent 1, qui fait partie de la liste des chiffres à correspondre.

Comme vous pouvez le constater, les expressions régulières sont une sorte de casse-tête, mais grâce à l'expérimentation et à la pratique, vous pouvez vous familiariser avec elles et les utiliser pour améliorer la façon dont vous parcourez vos données.

Téléchargez l'aide-mémoire

La commande grep a bien plus d'options que ce que j'ai démontré dans cet article. Il existe des options pour mieux formater les résultats, répertorier les fichiers et les numéros de ligne contenant des correspondances, fournir un contexte aux résultats en imprimant les lignes entourant une correspondance, et bien plus encore. Si vous apprenez grep, ou si vous l'utilisez souvent et avez recours à des recherches dans ses pages info, vous vous rendrez service en téléchargeant notre aide-mémoire correspondant. L'aide-mémoire utilise des options courtes (-v au lieu de --invert-matching, par exemple) pour vous familiariser avec les raccourcis grep courants. Il contient également une section regex pour vous aider à mémoriser les codes regex les plus courants. Téléchargez l'aide-mémoire grep dès aujourd'hui ! 

Articles connexes: