L'une des commandes classiques d'Unix, développée en 1974 par Ken Thompson, est la commande Global Regular Expression Print (grep). C'est tellement omniprésent dans l'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 les scénarios du monde réel. (Par exemple, "Je vais devoir grep mes banques de mémoire pour rappeler cette information.") En bref, grep est un moyen de rechercher dans un fichier un modèle spécifique de caractères. Si cela ressemble à la fonction de recherche 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 pittoresque 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 les 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 des expressions régulières pour fournir une capacité de recherche flexible.
Apprendre le grep
commande 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 gratuit]
Installation de grep
Si vous utilisez Linux, grep est déjà installé.
Sur macOS, vous avez la version BSD de grep. Cela diffère légèrement de la version GNU, donc si vous voulez 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 le grep
commandez un motif et un fichier que vous voulez qu'il 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, le grep
La commande est sensible à la casse, donc "gnu" est différent de "GNU" ou "Gnu". Vous pouvez lui faire ignorer les majuscules avec le --ignore-case
option.
$ 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 le grep
la commande retourne toutes les lignes sans une correspondance en utilisant le --invert-match
choix :
$ 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 la véritable puissance de POSIX réside dans sa capacité à enchaîner des commandes via des "tubes". 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 qui répertorie 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 grep pour les liens dans le fichier, en imprimant uniquement la chaîne correspondante en utilisant le --only-matching
choix :
$ 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
La sortie est une liste d'URL, chacune sur une ligne. C'est un ajustement naturel pour la façon dont Bash traite les données, donc au lieu d'avoir les URL imprimées sur mon terminal, je peux simplement les diriger vers curl
:
$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
Cela télécharge chaque fichier, en l'enregistrant selon 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 des expressions régulières, une sorte de langage « générique » qui est particulièrement utile lors d'une recherche large dans une grande quantité de texte.
Expression régulière
Personne n'a l'illusion que l'expression régulière ("regex" en abrégé) est facile. Cependant, je trouve qu'il a souvent une réputation pire qu'il ne le mérite. Certes, il y a le potentiel pour que les gens deviennent un peu trop intelligents avec regex jusqu'à ce qu'il soit si illisible et si large qu'il se replie sur lui-même, mais vous n'avez pas à exagérer votre regex. Voici une brève introduction à la regex 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 regex est l'humble .
personnage. Il représente un seul caractère.
$ grep Can.da example.txt
Canada
Le modèle Can.da
Canada
renvoyé avec succès parce que le .
caractère représenté par n'importe quel un caractère.
Le .
le caractère générique peut être modifié pour représenter plus d'un caractère 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 quatre fois à l'élément précédent (ou à tout nombre saisi entre accolades)
Armé de ces connaissances, vous pouvez pratiquer regex sur example.txt
tout l'après-midi, en voyant quelles combinaisons intéressantes vous proposez. Certains ne fonctionneront pas; d'autres le feront. L'important est d'analyser les résultats, afin que vous compreniez pourquoi.
L'expression régulière avancée nécessite l'--extended-regexp ou -E option.
Par exemple, cela ne renvoie aucun pays :
$ grep -E A.a example.txt
Il échoue car le .
Le personnage ne peut correspondre qu'à un seul personnage à moins que vous ne le mettiez à niveau. Utilisation du *
caractère, vous pouvez indiquer grep
pour 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 pas de noms de pays à trois lettres dans cette liste. Donc, à la place, vous pouvez utiliser +
pour faire correspondre un même 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 aussi pour les nombres. Les résultats pourraient vous surprendre :
$ grep [1-9] example.txt
1
3
11
Êtes-vous surpris de voir 11 dans une recherche de chiffres de 1 à 9 ?
Que se passe-t-il si vous ajoutez 13 à votre liste ?
Ces nombres sont renvoyés car ils incluent 1, qui fait partie de la liste des chiffres à faire correspondre.
Comme vous pouvez le constater, l'expression régulière est une sorte de casse-tête, mais grâce à l'expérimentation et à la pratique, vous pouvez vous y habituer et l'utiliser pour améliorer la façon dont vous parcourez vos données.
Télécharger la feuille de triche
Le grep
La commande 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 pour les résultats en imprimant les lignes entourant une correspondance, et bien plus encore. Si vous apprenez grep, ou si vous vous retrouvez simplement à l'utiliser souvent et à chercher dans ses info
pages, vous vous rendrez service en téléchargeant notre aide-mémoire pour cela. La feuille de triche utilise des options courtes (-v
au lieu de --invert-matching
, par exemple) comme moyen de vous familiariser avec la sténographie courante de grep. Il contient également une section regex pour vous aider à vous souvenir des codes regex les plus courants. Téléchargez la feuille de triche grep dès aujourd'hui !