grep
est l’une des commandes les plus pratiques dans un environnement de terminaux Linux. L’accronyme grep
signifie « global regular expression print » (rechercher globalement les correspondances avec l’expression régulière). Cela signifie que vous pouvez utiliser grep
pour voir si l’entrée qu’il reçoit correspond à un modèle spécifié. Apparemment trivial, ce programme est extrêmement puissant. Sa capacité à trier les entrées en fonction de règles complexes fait qu’il est couramment utilisé dans de nombreuses chaînes de commande.
Au cours de ce tutoriel, vous allez explorer les options de la commande grep
. Ensuite, vous allez approfondir vos connaissances dans l’utilisation des expressions régulières qui vous permettront d’effectuer des recherches plus avancées.
[interactive_terminal bash]
Au cours de ce tutoriel, vous allez utiliser grep
pour rechercher plusieurs mots et plusieurs phrases dans GNU General Public License version 3.
Si vous utilisez un système Ubuntu, vous pouvez trouver le fichier dans le dossier /usr/share/common-licenses
. Copiez-le dans votre répertoire home :
- cp /usr/share/common-licenses/GPL-3 .
Si vous êtes sur un autre système, utilisez la commande curl
pour en télécharger une copie :
- curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt
Vous allez également utiliser le fichier de licence BSD de ce tutoriel. Sous Linux, vous pouvez utiliser la commande suivante pour le copier dans votre répertoire home :
- cp /usr/share/common-licenses/BSD .
Si vous êtes sur un autre système, créez le fichier en utilisant la commande suivante :
- cat << 'EOF' > BSD
- Copyright (c) The Regents of the University of California.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- 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
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- EOF
Maintenant que vous avez les fichiers, vous pouvez commencer à travailler avec grep
.
Dans sa forme la plus basique, vous pouvez utiliser grep
pour trouver les correspondances avec des modèles littéraux dans un fichier texte. Cela signifie que si vous passez une commande grep
pour rechercher un mot, le système imprimera chaque ligne du fichier qui contient le mot en question.
Exécutez la commande suivante pour utiliser grep
et trouver ainsi toutes les lignes qui contiennent le mot GNU
:
- grep "GNU" GPL-3
Le premier argument, GNU
, est le modèle que vous recherchez alors que le second, GPL-3
, est le fichier saisi dans lequel vous souhaitez faire votre recherche.
La sortie affichera chacune des lignes qui contient le texte modèle :
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 modèle que vous recherchez sera mis en surbrillance dans la sortie.
Par défaut, grep
recherchera le modèle exact spécifié dans le fichier d’entrée et renverra les lignes qu’il trouvera. Vous pouvez rendre ce comportement plus pratique en ajoutant quelques balises facultatives à grep
.
Si vous souhaitez que grep
ignore la « case » de votre paramètre de recherche et que vous recherchez des variations à la fois en majuscule et en minuscule, vous pouvez spécifier l’option -i
ou --ignore-case
.
Recherchez chaque instance du mot license
(en majuscule, minuscule ou les deux) dans le même fichier qu’auparavant avec la commande suivante :
- grep -i "license" GPL-3
Les résultats incluent : 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
...
...
S’il y avait une instance avec LiCeNsE
, elle aurait également été renvoyée.
Si vous souhaitez trouver toutes les lignes qui ne contiennent pas le modèle 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 en exécutant la commande suivante :
- grep -v "the" BSD
Vous verrez la sortie suivante :
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
...
...
Étant donné que vous n’avez pas précisé l’option « ignorer case », les deux derniers éléments ont été renvoyés comme ne comportant pas le mot the
.
Il vous sera souvent utile de connaître le numéro de la ligne sur laquelle les correspondances sont trouvées. Pour se faire, vous pouvez utiliser l’option -n
ou --line-number
. Ré-exécutez l’exemple précédent en ajoutant la balise précédente :
- grep -vn "the" BSD
Vous verrez 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
...
...
Vous pouvez maintenant référencer le numéro des lignes dans le cas où vous souhaiteriez modifier chacune des lignes qui ne contient pas the
. Cela est particulièrement pratique lorsque vous travaillez avec un code source.
Au cours de l’introduction, vous avez appris que grep
signifiait « rechercher globalement les correspondances avec l’expression rationnelle ». Une « expression régulière » est une chaîne de texte qui décrit un modèle de recherche spécifique.
La manière dont les diverses applications et langages de programmation implémentent les expressions régulières est légèrement différente. Au cours de ce tutoriel, vous allez uniquement aborder un petit sous-ensemble de la façon dont grep
décrit ses modèles.
Dans les exemples précédents de ce tutoriel, lorsque vous avez recherché les mots GNU
et the
, en réalité, vous avez recherché les expressions régulières de base qui correspondaient à la chaîne exacte de caractères GNU
et the
. Les modèles qui spécifient exactement les caractères à mettre en correspondance se nomment « literals » car ils correspondent littéralement au modèle, character-for-character.
Il est plus facile de les considérer comme une correspondance à une chaîne de caractères plutôt qu’à un mot. La distinction deviendra plus importante à mesure que les modèles que vous aborderez seront plus complexes.
La correspondance se fera sur tous les caractères alphabétiques et numériques (ainsi que certains autres caractères) littéralement à moins qu’un autre mécanisme d’expression ne vienne la modifier.
Les ancres sont des caractères spéciaux qui spécifient à quel endroit de la ligne une correspondance est considérée comme valable.
Par exemple, en utilisant des ancres, vous pouvez spécifier que vous souhaitez uniquement obtenir les lignes qui comportent GNU
tout au début de la ligne. Pour cela, vous pouvez utiliser la balise ^
avant la chaîne littérale.
Exécutez la commande suivante pour rechercher le fichier GPL-3
et trouver les lignes où GNU
se trouve au tout début d’une ligne :
- grep "^GNU" GPL-3
Vous verrez apparaître 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 la même façon, vous devez utiliser l’ancre $
à la fin d’un modèle pour indiquer que la correspondance ne sera valable que si elle se trouve à la fin d’une ligne.
Cette commande permettra de faire la correspondance avec chaque ligne se terminant par le mot and
dans le fichier GPL-3
:
- grep "and$" GPL-3
Vous verrez la sortie suivante :
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
Dans les expressions régulières, le caractère du point (.) signifie que tout caractère individuel peut exister à l’endroit spécifié.
Par exemple, pour trouver toute correspondance dans le fichier GPL-3
qui contient deux caractères et puis la chaine cept
, vous devez utiliser le modèle suivant :
- grep "..cept" GPL-3
Vous verrez 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.
...
...
Comme vous pouvez le voir, la sortie affiche des instances à la fois de accept
et except
ainsi que des variations des deux mots. Le modèle devrait également trouver les correspondances avec z2cept
s’il y en avait.
En plaçant un groupe de caractères entre parenthèses (\[
et \]
), vous pouvez spécifier que le caractère qui se trouve à cette position peut être l’un des caractères du groupe entre parenthèses.
Par exemple, pour trouver les lignes qui en contiennent too
ou two
, vous devez spécifier ces variations succinctement en utilisant le modèle suivant :
- grep "t[wo]o" GPL-3
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 des parenthèses vous offre quelques options intéressantes. Vous pouvez utiliser un modèle qui trouve toutes les correspondances sauf les caractères entre parenthèses en commençant la liste de caractères entre parenthèses par un ^
Dans cet exemple, nous trouverons le modèle .ode
mais ne fera pas correspondre le modèle code
:
- grep "[^c]ode" GPL-3
Voici la sortie qui s’affichera :
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:
Notez que dans la seconde ligne renvoyée, il y a, en fait, le mot code
. Il ne s’agit pas d’un échec de l’expression régulière ou de grep. Au contraire, cette ligne a été renvoyée car plus tôt dans la ligne, le système a trouvé le modèle mode
qui se trouve dans le mot model
. La ligne a été renvoyée car il y avait une instance qui correspond au modèle.
Une autre des fonctionnalités utiles des parenthèses est que vous pouvez spécifier une gamme de caractères au lieu de saisir chaque caractère disponible individuellement.
Ainsi, si vous le souhaitez, vous pouvez trouver toutes les lignes qui commencent par une lettre majuscule avec le modèle suivant :
- grep "^[A-Z]" GPL-3
Voici la sortie que vous verrez :
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
...
...
À cause de certains des problèmes de tri hérités, il est souvent plus juste d’utiliser les catégories de caractères POSIX à la place des gammes de caractères que vous venez d’utiliser.
Il existe plusieurs caractères qui sont en-dehors du champ de ce guide, mais voici un exemple qui accomplira la même procédure que celle de l’exemple précédent en utilisant la catégorie de caractères \[:upper:\]
dans un sélectionneur de parenthèses :
- grep "^[[:upper:]]" GPL-3
La sortie sera la même qu’auparavant.
Enfin, l’un des méta-caractères les plus couramment utilisés est l’astérisque ou *
, qui signifie « répétez le caractère précédent ou l’expression zero ou more times ».
Pour trouver chaque ligne dans le fichier GPL-3
qui contient des parenthèses d’ouverture et de fermeture, avec seulement des lettres et des espaces uniques entre les deux, utilisez l’expression suivante :
- grep "([A-Za-z ]*)" GPL-3
Vous verrez 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é les points, les astérisques et d’autres caractères dans vos expressions. Cependant, vous aurez parfois besoin de rechercher ces caractères spécifiques.
Parfois, vous aurez besoin de trouver un point ou une parenthèse d’ouverture en tant que tel, tout particulièrement lorsque vous travaillerez avec un code source ou des fichiers de configuration. Étant donné 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 pouvez éviter des caractères en utilisant un caractère de barre oblique inverse (\
) devant le caractère qui devrait normalement avoir une signification spéciale.
Par exemple, pour trouver toutes les lignes qui commencent par une lettre majuscule et se termine par un point, utilisez l’expression suivante qui évite le point final afin qu’elle représente un point littéral et non pas le sens habituel « any character » :
- grep "^[A-Z].*\.$" GPL-3
Voici la sortie qui s’affichera :
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.
Prenons maintenant en considération d’autres options d’expressions régulières.
La commande grep
prend en charge un langage d’expression plus vaste en utilisant la balise -E
ou en appelant la commande egrep
au lieu de grep
.
Ces options vous donne la possibilité d’utiliser des « expressions régulières étendues ». Les expressions régulières étendues incluent tous les méta-caractères de base ainsi que les méta-caractères supplémentaires qui permettent d’exprimer des caractères plus complexes.
L’une des capacités les plus utiles qu’offrent les expressions régulières étendues est la possibilité de regrouper des expressions ensemble et de les manipuler ou d’y faire référence en tant qu’une seule unité.
Groupez les expressions ensemble à l’aide de parenthèses. Si vous souhaitez utiliser des parenthèses sans utiliser des expressions régulières étendues, vous pouvez les éviter avec la barre oblique inverse pour activer cette fonctionnalité.
Les trois expressions suivantes se valent en termes de fonctionnalité :
- grep "\(grouping\)" file.txt
- grep -E "(grouping)" file.txt
- egrep "(grouping)" file.txt
Tout comme les expressions entre parenthèses peuvent spécifier différents choix possibles de correspondance avec des caractères uniques, l’alternance vous permet de spécifier des correspondances alternatives pour les chaînes de caractères ou ensembles d’expression.
Pour indiquer une alternance, utilisez le caractère de barre droite |
. Ils sont souvent utilisés dans des regroupements entre parenthèses pour spécifier qu’une sur deux ou plusieurs des possibilités devraient être considérées comme une correspondance.
La commande suivante trouvera soit GPL
ou General Public Licence
dans le texte :
- grep -E "(GPL|General Public License)" GPL-3
Le résultat ressemblera à ce qui suit :
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
...
...
Avec l’alternance, vous pouvez faire votre sélection entre plus de deux options en ajoutant des choix supplémentaires dans le groupe de sélection séparé par des caractères supplémentaires de barre oblique (|).
Comme le méta-caractère *
qui correspond au caractère précédent ou au caractère défini sur zero ou more times, d’autres méta-caractères disponibles dans des expressions régulières étendues permettent de spécifier le nombre d’événements.
Pour trouver une correspondance de caractère zero ou one times, vous pouvez utiliser le ?
. Cela rend le caractère ou les ensembles de caractères précédents optionnels, par essence.
La commande suivante cherche les correspondances de copyright
et right
en plaçant copy
dans un groupe optionnel :
- grep -E "(copy)?right" GPL-3
Vous verrez la sortie suivante :
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 à l’apparition une ou plusieurs fois d’une expression. Il est presque similaire au 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’espacement :
- grep -E "free[^[:space:]]+" GPL-3
Vous verrez la sortie suivante :
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.
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 avec exactitude un numéro, une plage ou une limite supérieure ou inférieure pour le nombre de fois qu’une correspondance à une expression est trouvée.
Utilisez l’expression suivante pour trouver toutes les lignes dans le fichier GPL-3
qui contiennent trois voyelles :
- grep -E "[AEIOUaeiou]{3}" GPL-3
Chaque ligne renvoyé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 trouver la correspondance avec tous les mots qui ont entre 16 et 20 caractères, utilisez l’expression suivante :
- grep -E "[[:alpha:]]{16,20}" GPL-3
Vous verrez la sortie suivante :
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 s’afficheront.
grep
est une fonctionnalité pratique pour trouver des modèles dans des fichiers ou la hiérarchie du système de fichiers. Il est donc conseiller de passer un peu de temps pour se familiariser avec ses options et sa syntaxe.
Les expressions régulières sont encore plus versatiles et peuvent être utilisées avec plusieurs programmes populaires. Par exemple, de nombreux éditeurs de texte implémentent des expressions régulières pour rechercher et remplacer du texte.
En outre, la plupart des langages de programmation modernes utilisent des expressions régulières pour exécuter des procédures sur des données spécifiques. Une fois que vous aurez compris les expressions régulières, vous pourrez transférer ces connaissances sur plusieurs tâches informatiques courantes, de la recherche avancée dans votre éditeur de texte à la validation des entrées de l’utilisateur.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!