Introduction
La commande grep
est l’une des commandes les plus utiles dans un environnement de terminal Linux. Le nom grep
signifie « global regular expression print ». Cela signifie que vous pouvez utiliser grep
pour vérifier si l’entrée qu’il reçoit correspond à un motif spécifié. Ce programme en apparence trivial est extrêmement puissant ; sa capacité à trier les entrées en fonction de règles complexes en fait un maillon populaire dans de nombreuses chaînes de commandes.
Dans ce tutoriel, vous explorerez les options de la commande grep
, puis vous plongerez dans l’utilisation d’expressions régulières pour effectuer des recherches plus avancées.
Prérequis
Pour suivre ce guide, vous aurez besoin d’un accès à un ordinateur exécutant un système d’exploitation basé sur Linux. Il peut s’agir soit d’un serveur privé virtuel auquel vous vous êtes connecté avec SSH, soit de votre machine locale. Notez que ce tutoriel a été validé à l’aide d’un serveur Linux exécutant Ubuntu 20.04, mais les exemples donnés devraient fonctionner sur un ordinateur exécutant n’importe quelle version de n’importe quelle distribution Linux.
Si vous prévoyez d’utiliser un serveur distant pour suivre ce guide, nous vous encourageons d’abord à compléter notre guide Configuration initiale du serveur. Ce faisant, vous disposerez d’un environnement de serveur sécurisé, comprenant un utilisateur non-root avec des privilèges sudo
et un pare-feu configuré avec UFW, que vous pouvez utiliser pour développer vos compétences Linux.
Utilisation de base
Dans ce tutoriel, vous utiliserez grep
pour rechercher la licence publique générale GNU version 3 pour divers mots et expressions.
Si vous êtes sur un système Ubuntu, vous pouvez trouver le fichier dans le dossier /usr/share/common-licenses
. Copiez-le dans votre répertoire personnel :
Si vous êtes sur un autre système, utilisez la commande curl
pour télécharger une copie :
Vous utiliserez également le fichier de licence BSD dans ce tutoriel. Sur Linux, vous pouvez copier celui-ci dans votre répertoire personnel avec la commande suivante :
Si vous êtes sur un autre système, créez le fichier avec la commande suivante :
Maintenant que vous avez les fichiers, vous pouvez commencer à travailler avec grep
.
Sous sa forme la plus basique, vous utilisez grep
pour faire correspondre des motifs littéraux dans un fichier texte. Cela signifie que si vous passez à grep
un mot à rechercher, il affichera chaque ligne du fichier contenant ce mot.
Exécutez la commande suivante pour utiliser grep
afin de rechercher chaque ligne contenant le mot GNU
:
Le premier argument, GNU
, est le motif que vous recherchez, tandis que le deuxième argument, GPL-3
, est le fichier d’entrée que vous souhaitez rechercher.
Le résultat affichera chaque ligne contenant le texte du motif :
Output 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
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...
Sur certains systèmes, le motif que vous avez recherché sera mis en surbrillance dans la sortie.
Options Courantes
Par défaut, grep
recherchera le motif spécifié exactement dans le fichier d’entrée et renverra les lignes qu’il trouve. Vous pouvez rendre ce comportement plus utile en ajoutant quelques drapeaux facultatifs à grep
.
Si vous voulez que grep
ignore la « casse » de votre paramètre de recherche et recherche les variations en majuscules et minuscules, vous pouvez spécifier l’option -i
ou --ignore-case
.
Recherchez chaque occurrence du mot license
(avec des cas en majuscules, minuscules ou mixtes) dans le même fichier qu’auparavant avec la commande suivante :
Les résultats contiennent : LICENSE
, license
et License
:
Output GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
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
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
...
...
Si une occurrence avec LiCeNsE
existait, elle aurait également été renvoyée.
Si vous voulez trouver toutes les lignes qui ne contiennent pas un motif spécifié, vous pouvez utiliser l’option -v
ou --invert-match
.
Recherchez chaque ligne qui ne contient pas le mot the
dans la licence BSD avec la commande suivante :
Vous recevrez cette sortie :
OutputAll rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Comme vous n’avez pas spécifié l’option « ignorer la casse », les deux derniers éléments ont été renvoyés comme n’ayant pas le mot the
.
Il est souvent utile de connaître le numéro de ligne où les correspondances se produisent. Vous pouvez le faire en utilisant l’option -n
ou --line-number
. Exécutez à nouveau l’exemple précédent avec ce drapeau ajouté :
Cela renverra le texte suivant :
Output2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Maintenant, vous pouvez faire référence au numéro de ligne si vous souhaitez apporter des modifications à chaque ligne qui ne contient pas the
. C’est particulièrement pratique lorsque vous travaillez avec du code source.
Expressions Régulières
Dans l’introduction, vous avez appris que grep
signifie « global regular expression print ». Une « expression régulière » est une chaîne de texte qui décrit un motif de recherche particulier.
Différentes applications et langages de programmation implémentent les expressions régulières légèrement différemment. Dans ce tutoriel, vous explorerez uniquement une petite partie de la manière dont grep
décrit ses motifs.
Correspondances littérales
Dans les exemples précédents de ce tutoriel, lorsque vous avez recherché les mots GNU
et the
, vous recherchiez en fait des expressions régulières de base qui correspondaient exactement à la chaîne de caractères GNU
et the
. Les motifs qui spécifient exactement les caractères à rechercher sont appelés « littéraux » car ils correspondent littéralement au motif, caractère par caractère.
Il est utile de considérer ces correspondances comme correspondant à une chaîne de caractères plutôt qu’à un mot. Cette distinction deviendra plus importante à mesure que vous apprendrez des motifs plus complexes.
Tous les caractères alphabétiques et numériques (ainsi que certains autres caractères) sont recherchés littéralement sauf s’ils sont modifiés par d’autres mécanismes d’expression.
Correspondances d’ancrage
Les ancres sont des caractères spéciaux qui spécifient où dans la ligne une correspondance doit avoir lieu pour être valide.
Par exemple, en utilisant des ancres, vous pouvez spécifier que vous voulez seulement connaître les lignes qui correspondent à GNU
au tout début de la ligne. Pour ce faire, vous pourriez utiliser l’ancrage ^
avant la chaîne littérale.
Exécutez la commande suivante pour rechercher le fichier GPL-3
et trouver les lignes où GNU
apparaît au tout début d’une ligne:
Cette commande renverra les deux lignes suivantes:
OutputGNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
De même, utilisez l’ancrage $
à la fin d’un motif pour indiquer que la correspondance ne sera valide que si elle se trouve tout à la fin d’une ligne.
Cette commande correspondra à chaque ligne se terminant par le mot and
dans le fichier GPL-3
:
Vous recevrez cette sortie:
Outputthat there is no warranty for this free software. For both users' and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and
Correspondance de N’importe Quel Caractère
Le caractère point (.) est utilisé dans les expressions régulières pour signifier qu’un seul caractère peut exister à l’emplacement spécifié.
Par exemple, pour faire correspondre n’importe quoi dans le fichier GPL-3
qui a deux caractères et ensuite la chaîne cept
, vous utiliseriez le motif suivant:
Cette commande renvoie la sortie suivante:
Outputuse, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
...
...
Cette sortie contient des occurrences de accept
et except
ainsi que des variations des deux mots. Le motif aurait également correspondu à z2cept
s’il avait été trouvé également.
Expressions entre Crochets
En plaçant un groupe de caractères entre crochets (\[
et \]
), vous pouvez spécifier que le caractère à cette position peut être n’importe quel caractère trouvé dans le groupe entre crochets.
Par exemple, pour trouver les lignes contenant too
ou two
, vous spécifierez ces variations de manière concise en utilisant le modèle suivant:
La sortie montre que les deux variations existent dans le fichier:
Outputyour programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
...
...
La notation entre crochets vous offre quelques options intéressantes. Vous pouvez faire correspondre le modèle à tout sauf les caractères à l’intérieur d’un crochet en commençant la liste des caractères à l’intérieur des crochets par un caractère ^
.
Cet exemple est semblable au modèle .ode
, mais ne correspondra pas au modèle code
:
Voici la sortie que vous obtiendrez:
Output 1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
Remarquez que dans la deuxième ligne retournée, il y a en fait le mot code
. Ce n’est pas un échec de l’expression régulière ou de grep. Plutôt, cette ligne a été retournée parce qu’au début de la ligne, le modèle mode
, trouvé dans le mot model
, a été trouvé. La ligne a été retournée car il y avait une instance correspondant au modèle.
Une autre fonctionnalité utile des crochets est que vous pouvez spécifier une plage de caractères au lieu de taper individuellement chaque caractère disponible.
Cela signifie que si vous voulez trouver chaque ligne commençant par une lettre majuscule, vous pouvez utiliser le modèle suivant:
Voici la sortie que cette expression retourne:
OutputGNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...
En raison de certains problèmes de tri hérités, il est souvent plus précis d’utiliser les classes de caractères POSIX au lieu des plages de caractères que vous venez d’utiliser.
Discuter de chaque classe de caractères POSIX serait hors de portée de ce guide, mais un exemple qui accomplirait la même procédure que l’exemple précédent utilise la classe de caractères \[:upper:\]
dans un sélecteur entre crochets :
La sortie sera la même qu’auparavant.
Répéter le motif zéro ou plusieurs fois
Enfin, l’un des méta-caractères les plus couramment utilisés est l’astérisque, ou *
, ce qui signifie « répéter le caractère ou l’expression précédente zéro ou plusieurs fois ».
Pour trouver chaque ligne dans le fichier GPL-3
qui contient une parenthèse ouvrante et une parenthèse fermante, avec seulement des lettres et des espaces simples entre elles, utilisez l’expression suivante :
Vous obtiendrez la sortie suivante :
Output Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
...
...
Jusqu’à présent, vous avez utilisé des points, des astérisques et d’autres caractères dans vos expressions, mais parfois vous devez rechercher ces caractères spécifiquement.
Échapper aux méta-caractères
Il y a des moments où vous devrez rechercher un point littéral ou une parenthèse ouvrante littérale, notamment lorsque vous travaillez avec du code source ou des fichiers de configuration. Parce que ces caractères ont une signification spéciale dans les expressions régulières, vous devez « échapper » ces caractères pour indiquer à grep
que vous ne souhaitez pas utiliser leur signification spéciale dans ce cas.
Vous échappez aux caractères en utilisant le caractère backslash (\
) devant le caractère qui aurait normalement une signification spéciale.
Par exemple, pour trouver toute ligne commençant par une lettre majuscule et se terminant par un point, utilisez l’expression suivante qui échappe au point final afin qu’il représente un point littéral au lieu de la signification habituelle de « tout caractère » :
Voici la sortie que vous verrez :
OutputSource.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
Maintenant, examinons d’autres options d’expressions régulières.
Expressions Régulières Étendues
La commande grep
prend en charge un langage d’expression régulière plus étendu en utilisant le drapeau -E
ou en appelant la commande egrep
au lieu de grep
.
Ces options ouvrent les capacités des « expressions régulières étendues ». Les expressions régulières étendues incluent tous les méta-caractères de base, ainsi que des méta-caractères supplémentaires pour exprimer des correspondances plus complexes.
Regroupement
Une des capacités les plus utiles qu’ouvrent les expressions régulières étendues est la capacité de regrouper des expressions ensemble pour les manipuler ou les référencer comme une seule unité.
Pour regrouper des expressions ensemble, enveloppez-les entre parenthèses. Si vous souhaitez utiliser des parenthèses sans utiliser d’expressions régulières étendues, vous pouvez les échapper avec le backslash pour activer cette fonctionnalité. Cela signifie que les trois expressions suivantes sont fonctionnellement équivalentes :
Alternance
Similaire à la façon dont les expressions entre crochets peuvent spécifier différentes choix possibles pour des correspondances de caractères simples, l’alternance vous permet de spécifier des correspondances alternatives pour des chaînes ou des ensembles d’expressions.
Pour indiquer l’alternance, utilisez le caractère pipe |
. Ils sont souvent utilisés dans des regroupements parenthétiques pour spécifier qu’une des deux possibilités ou plus devrait être considérée comme une correspondance.
Le suivant trouvera soit GPL
soit General Public License
dans le texte :
La sortie ressemble à ceci :
Output 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
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...
L’alternance peut sélectionner entre plus de deux choix en ajoutant des choix supplémentaires au sein du groupe de sélection séparés par des caractères pipe (|
) supplémentaires.
Quantificateurs
Tout comme le méta-caractère *
qui correspondait au caractère précédent ou à l’ensemble de caractères zéro ou plusieurs fois, il existe d’autres méta-caractères disponibles dans les expressions rationnelles étendues qui spécifient le nombre d’occurrences.
Pour correspondre à un caractère zéro ou une fois, vous pouvez utiliser le caractère ?
. Cela rend le caractère ou l’ensemble de caractères qui précède facultatif, en essence.
La correspondance suivante fait correspondre copyright
et right
en plaçant copy
dans un groupe facultatif :
Vous obtiendrez cette sortie :
Output Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
...
Le caractère +
correspond à une expression une ou plusieurs fois. C’est presque comme le méta-caractère *
, mais avec le caractère +
, l’expression doit correspondre au moins une fois.
L’expression suivante correspond à la chaîne free
plus un ou plusieurs caractères qui ne sont pas des caractères d’espace blanc :
Vous verrez cette sortie :
Output The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedomss that you received. You must make sure that they, too, receive
protecting users' freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.
Spécification de la Répétition de Correspondance
Pour spécifier le nombre de fois qu’une correspondance est répétée, utilisez les caractères d’accolade ({
et }
). Ces caractères vous permettent de spécifier un nombre exact, une plage, ou une borne supérieure ou inférieure à la quantité de fois qu’une expression peut correspondre.
Utilisez l’expression suivante pour trouver toutes les lignes dans le fichier GPL-3
qui contiennent des triples voyelles:
Chaque ligne retournée contient un mot avec trois voyelles:
Outputchanged, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
Pour correspondre à tous les mots ayant entre 16 et 20 caractères, utilisez l’expression suivante:
Voici la sortie de cette commande:
Output certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or
Seules les lignes contenant des mots de cette longueur sont affichées.
Conclusion
grep
est utile pour trouver des motifs dans des fichiers ou dans la hiérarchie du système de fichiers, il vaut donc la peine de passer du temps à vous familiariser avec ses options et sa syntaxe.
Les expressions régulières sont encore plus polyvalentes et peuvent être utilisées avec de nombreux programmes populaires. Par exemple, de nombreux éditeurs de texte implémentent des expressions régulières pour rechercher et remplacer du texte.
De plus, la plupart des langages de programmation modernes utilisent des expressions régulières pour effectuer des procédures sur des morceaux de données spécifiques. Une fois que vous comprenez les expressions régulières, vous pourrez transférer ces connaissances à de nombreuses tâches informatiques courantes, de la réalisation de recherches avancées dans votre éditeur de texte à la validation des saisies utilisateur.