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

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 :

  1. cp /usr/share/common-licenses/GPL-3 .

Si vous êtes sur un autre système, utilisez la commande curl pour télécharger une copie :

  1. curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

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 :

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

Si vous êtes sur un autre système, créez le fichier avec 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.

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 :

  1. grep "GNU" GPL-3

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 :

  1. grep -i "license" GPL-3

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 :

  1. grep -v "the" BSD

Vous recevrez cette sortie :

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

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

  1. grep -vn "the" BSD

Cela renverra 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 ... ...

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:

  1. grep "^GNU" GPL-3

Cette commande renverra 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 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:

  1. grep "and$" GPL-3

Vous recevrez cette sortie:

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

  1. grep "..cept" GPL-3

Cette commande renvoie 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. ... ...

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:

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

  1. grep "[^c]ode" GPL-3

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:

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

Voici la sortie que cette expression retourne:

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

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 :

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

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 :

  1. grep "([A-Za-z ]*)" GPL-3

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

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

Voici la sortie que vous verrez :

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.

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 :

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

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 :

  1. grep -E "(GPL|General Public License)" GPL-3

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 :

  1. grep -E "(copy)?right" GPL-3

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 :

  1. grep -E "free[^[:space:]]+" GPL-3

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:

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

Chaque ligne retourné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 correspondre à tous les mots ayant entre 16 et 20 caractères, utilisez l’expression suivante:

  1. grep -E "[[:alpha:]]{16,20}" GPL-3

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.

Source:
https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux