Tutorial

Utiliser Grep et les expressions régulières pour rechercher des modèles de texte en Linux

Published on March 19, 2021
Français
Utiliser Grep et les expressions régulières pour rechercher des modèles de texte en Linux

Introduction

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]

Utilisation de base

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 :

  1. 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 :

  1. 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 :

  1. cp /usr/share/common-licenses/BSD .

Si vous êtes sur un autre système, créez le fichier en utilisant la commande suivante :

  1. cat << 'EOF' > BSD
  2. Copyright (c) The Regents of the University of California.
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the University nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. 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 :

  1. 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.

Options courantes

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 :

  1. 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 :

  1. grep -v "the" BSD

Vous verrez la sortie suivante :

Output
All 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 :

  1. grep -vn "the" BSD

Vous verrez le texte suivant :

Output
2: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.

Expressions régulières

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.

Correspondances littérales

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.

Correspondances avec les ancres

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 :

  1. grep "^GNU" GPL-3

Vous verrez apparaître les deux lignes suivantes :

Output
GNU 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 :

  1. grep "and$" GPL-3

Vous verrez la sortie suivante :

Output
that 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 avec tout caractère

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 :

  1. grep "..cept" GPL-3

Vous verrez la sortie suivante :

Output
use, 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.

Expressions entre parenthèses

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 :

  1. grep "t[wo]o" GPL-3

La sortie montre que les deux variations existent dans le fichier :

Output
your 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 :

  1. 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 :

  1. grep "^[A-Z]" GPL-3

Voici la sortie que vous verrez :

Output
GNU 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 :

  1. grep "^[[:upper:]]" GPL-3

La sortie sera la même qu’auparavant.

Répéter le modèle Zero ou More Times

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 :

  1. 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.

Éviter le méta-caractères

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 » :

  1. grep "^[A-Z].*\.$" GPL-3

Voici la sortie qui s’affichera :

Output
Source. 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.

Expressions régulières étendues

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.

Regroupement

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é :

  1. grep "\(grouping\)" file.txt
  2. grep -E "(grouping)" file.txt
  3. egrep "(grouping)" file.txt

Alternance

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 :

  1. 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 (|).

Quantificateurs

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 :

  1. 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 :

  1. 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.

Spécifier 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 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 :

  1. grep -E "[AEIOUaeiou]{3}" GPL-3

Chaque ligne renvoyée contient un mot avec trois voyelles :

Output
changed, 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 :

  1. 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.

Conclusion

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.

Learn more about us


About the authors


Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


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!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel