Utilisation de Grep et d'expressions régulières pour rechercher des modèles de texte sous Linux
Introduction
La commande grep est l'une des commandes les plus utiles dans un environnement de terminal Linux. Le nom grep signifie « impression d'expression régulière globale ». Cela signifie que vous pouvez utiliser grep pour vérifier si l'entrée qu'il reçoit correspond à un modèle spécifié. Ce programme apparemment 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 commande.
Dans ce didacticiel, vous explorerez les options de la commande grep, puis vous découvrirez l'utilisation d'expressions régulières pour effectuer des recherches plus avancées.
Conditions préalables
Pour suivre ce guide, vous aurez besoin d'accéder à un ordinateur exécutant un système d'exploitation basé sur Linux. Il peut s'agir soit d'un serveur privé virtuel auquel vous êtes connecté via SSH, soit de votre machine locale. Notez que ce didacticiel 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 envisagez d'utiliser un serveur distant pour suivre ce guide, nous vous encourageons à suivre d'abord notre guide de configuration initiale du serveur. Cela vous permettra de disposer d'un environnement de serveur sécurisé - comprenant un utilisateur non root avec les privilèges sudo et un pare-feu configuré avec UFW - que vous pourrez utiliser pour créer votre Linux. compétences.
Utilisation de base
Dans ce didacticiel, vous utiliserez grep pour rechercher divers mots et expressions dans la licence publique générale GNU 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 personnel :
- 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 :
- curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt
Vous utiliserez également le fichier de licence BSD dans ce didacticiel. Sous Linux, vous pouvez le copier dans votre répertoire personnel avec la commande suivante :
- cp /usr/share/common-licenses/BSD .
Si vous êtes sur un autre système, créez le fichier avec 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 disposez des fichiers, vous pouvez commencer à travailler avec grep.
Dans la forme la plus basique, vous utilisez grep pour faire correspondre des modèles littéraux dans un fichier texte. Cela signifie que si vous transmettez grep un mot à rechercher, il imprimera chaque ligne du fichier contenant ce mot.
Exécutez la commande suivante pour utiliser grep pour rechercher chaque ligne contenant le mot GNU :
- grep "GNU" GPL-3
Le premier argument, GNU, est le modèle que vous recherchez, tandis que le deuxième argument, GPL-3, est le fichier d'entrée que vous souhaitez rechercher.
Le résultat résultant sera chaque ligne contenant le texte du modèle :
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 communes
Par défaut, grep recherchera le modèle exact spécifié dans le fichier d'entrée et renverra les lignes qu'il trouve. Vous pouvez cependant rendre ce comportement plus utile en ajoutant des indicateurs facultatifs à grep.
Si vous souhaitez que grep ignore la « casse » de votre paramètre de recherche et recherche les variantes majuscules et minuscules, vous pouvez spécifier le -i ou le --ignore-case.
Recherchez chaque instance du mot license (avec majuscules, minuscules ou mixtes) dans le même fichier que précédemment avec la commande suivante :
- grep -i "license" GPL-3
Les résultats contiennent : LICENSE, license et License :
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, cela aurait également été renvoyé.
Si vous souhaitez rechercher toutes les lignes qui ne contiennent pas un modèle spécifié, vous pouvez utiliser l'option -v ou --invert-match.
Recherchez chaque ligne qui ne contient pas le mot le dans la licence BSD avec la commande suivante :
- grep -v "the" BSD
Vous recevrez ce résultat :
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
...
...
Puisque 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 le.
Il est souvent utile de connaître le numéro de ligne sur lequel les correspondances se produisent. Vous pouvez le faire en utilisant l'option -n ou --line-number. Réexécutez l'exemple précédent avec cet indicateur ajouté :
- grep -vn "the" BSD
Cela renverra le texte suivant :
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 désormais référencer le numéro de ligne si vous souhaitez apporter des modifications à chaque ligne qui ne contient pas le le. Ceci est particulièrement pratique lorsque vous travaillez avec du code source.
Expressions régulières
Dans l'introduction, vous avez appris que grep signifie « impression d'expression régulière globale ». Une « expression régulière » est une chaîne de texte qui décrit un modèle de recherche particulier.
Différentes applications et langages de programmation implémentent les expressions régulières de manière légèrement différente. Dans ce didacticiel, vous n'explorerez qu'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 didacticiel, lorsque vous recherchiez les mots GNU et le, vous recherchiez en réalité des expressions régulières de base correspondant à la chaîne exacte de caractères GNU et le. Les modèles qui spécifient exactement les caractères à rechercher sont appelés « littéraux » car ils correspondent littéralement au modèle, caractère pour caractère.
Il est utile de les considérer comme correspondant à une chaîne de caractères plutôt qu'à un mot. Cela deviendra une distinction plus importante à mesure que vous apprendrez des modèles plus complexes.
Tous les caractères alphabétiques et numériques (ainsi que certains autres caractères) correspondent littéralement à moins qu'ils ne soient modifiés par d'autres mécanismes d'expression.
Matchs d'ancrage
Les ancres sont des caractères spéciaux qui spécifient où dans la ligne une correspondance doit se produire pour être valide.
Par exemple, en utilisant des ancres, vous pouvez spécifier que vous souhaitez uniquement connaître les lignes qui correspondent à GNU au tout début de la ligne. Pour ce faire, vous pouvez utiliser l'ancre ^ 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 :
- grep "^GNU" GPL-3
Cette commande renverra les deux lignes suivantes :
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, vous utilisez l'ancre $ à la fin d'un modèle pour indiquer que la correspondance ne sera valide que si elle se produit à la toute fin d'une ligne.
Cette commande correspondra à chaque ligne se terminant par le mot et dans le fichier GPL-3 :
- grep "and$" GPL-3
Vous recevrez ce résultat :
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
Correspondant à n'importe quel personnage
Le point (.) est utilisé dans les expressions régulières pour signifier que n'importe quel caractère peut exister à l'emplacement spécifié.
Par exemple, pour faire correspondre tout élément du fichier GPL-3 qui comporte deux caractères puis la chaîne cept, vous utiliserez le modèle suivant :
- grep "..cept" GPL-3
Cette commande renvoie le résultat suivant :
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 instances de accept et sauf et des variantes des deux mots. Le modèle aurait également correspondu à z2cept si cela avait également été trouvé.
Expressions entre parenthèses
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 de crochets.
Par exemple, pour rechercher les lignes qui contiennent too ou two, vous devez spécifier ces variantes succinctement en utilisant le modèle suivant :
- grep "t[wo]o" GPL-3
Le résultat montre que les deux variantes existent dans le fichier :
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 parenthèses vous offre des options intéressantes. Vous pouvez faire en sorte que le modèle corresponde à tout sauf les caractères entre crochets en commençant la liste des caractères entre crochets par un caractère ^.
Cet exemple est similaire au modèle .ode, mais ne correspondra pas au modèle code :
- grep "[^c]ode" GPL-3
Voici le résultat que vous recevrez :
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 deuxième ligne renvoyée, il y a en fait le mot code. Ce n'est pas un échec de l'expression régulière ou de grep. Cette ligne a plutôt été renvoyée car plus tôt dans la ligne, le modèle mode, trouvé dans le mot model, a été trouvé. La ligne a été renvoyée car il existait 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 saisir individuellement chaque caractère disponible.
Cela signifie que si vous souhaitez rechercher chaque ligne commençant par une lettre majuscule, vous pouvez utiliser le modèle suivant :
- grep "^[A-Z]" GPL-3
Voici le résultat renvoyé par cette expression :
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 des classes de caractères POSIX au lieu de plages de caractères comme vous venez d'utiliser.
Discuter de chaque classe de caractères POSIX dépasserait le cadre 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 de crochets. :
- grep "^[[:upper:]]" GPL-3
Le résultat sera le même qu’avant.
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 *, qui signifie « répéter le caractère ou l'expression précédent zéro ou plusieurs fois ».
Pour rechercher chaque ligne du fichier GPL-3 qui contient une parenthèse ouvrante et fermante, avec uniquement des lettres et des espaces simples entre les deux, utilisez l'expression suivante :
- grep "([A-Za-z ]*)" GPL-3
Vous obtiendrez le résultat suivant :
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 vous devez parfois rechercher spécifiquement ces caractères.
É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, en particulier lorsque vous travaillez avec du code source ou des fichiers de configuration. Parce que ces caractères ont une signification particulière dans les expressions régulières, vous devez « échapper » ces caractères pour indiquer à grep que vous ne souhaitez pas utiliser leur signification particulière dans ce cas.
Vous échappez les caractères en utilisant la barre oblique inverse (\) devant le caractère qui aurait normalement une signification particulière.
Par exemple, pour rechercher une ligne commençant par une majuscule et se terminant par un point, utilisez l'expression suivante qui échappe au point final afin qu'elle représente un point littéral au lieu de la signification habituelle de « n'importe quel caractère » :
- grep "^[A-Z].*\.$" GPL-3
Voici le résultat que vous verrez :
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.
Examinons maintenant 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 l'indicateur -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
L’une des capacités les plus utiles offertes par les expressions régulières étendues est la possibilité de regrouper des expressions pour les manipuler ou les référencer comme une seule unité.
Pour regrouper des expressions, placez-les entre parenthèses. Si vous souhaitez utiliser des parenthèses sans utiliser d'expressions régulières étendues, vous pouvez les échapper avec la barre oblique inverse pour activer cette fonctionnalité. Cela signifie que les trois expressions suivantes sont fonctionnellement équivalentes :
- grep "\(grouping\)" file.txt
- grep -E "(grouping)" file.txt
- egrep "(grouping)" file.txt
Alternance
De la même manière que les expressions entre crochets peuvent spécifier différents choix possibles pour les correspondances de caractères uniques, 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 barre verticale |. Ceux-ci sont souvent utilisés dans un regroupement entre parenthèses pour spécifier qu'une possibilité parmi deux ou plusieurs doit être considérée comme une correspondance.
Les éléments suivants trouveront soit GPL soit General Public License dans le texte :
- grep -E "(GPL|General Public License)" GPL-3
Le résultat ressemble à ceci :
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 choisir entre plus de deux choix en ajoutant des choix supplémentaires dans le groupe de sélection séparés par des caractères barres supplémentaires (|).
Quantificateurs
Comme le méta-caractère * qui correspondait zéro ou plusieurs fois au caractère ou au jeu de caractères précédent, il existe d'autres méta-caractères disponibles dans les expressions régulières étendues qui spécifient le nombre d'occurrences.
Pour faire correspondre un caractère zéro ou une fois, vous pouvez utiliser le caractère ?. Cela rend les caractères ou les jeux de caractères antérieurs facultatifs, par essence.
Ce qui suit fait correspondre copyright et right en plaçant copy dans un groupe facultatif :
- grep -E "(copy)?right" GPL-3
Vous recevrez ce résultat :
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 espaces :
- grep -E "free[^[:space:]]+" GPL-3
Vous verrez cette sortie :
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 des correspondances
Pour spécifier le nombre de fois qu'une correspondance est répétée, utilisez les accolades ({ et }). Ces caractères vous permettent de spécifier un nombre exact, une plage ou une limite supérieure ou inférieure du nombre de fois qu'une expression peut correspondre.
Utilisez l'expression suivante pour rechercher toutes les lignes du fichier GPL-3 qui contiennent des voyelles triples :
- grep -E "[AEIOUaeiou]{3}" GPL-3
Chaque ligne renvoyée contient un mot avec trois voyelles :
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 faire correspondre des mots comportant entre 16 et 20 caractères, utilisez l'expression suivante :
- grep -E "[[:alpha:]]{16,20}" GPL-3
Voici le résultat de cette commande :
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 modèles dans les fichiers ou dans la hiérarchie du système de fichiers, cela vaut donc la peine de prendre le temps de se 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 éléments de données spécifiques. Une fois que vous aurez compris les expressions régulières, vous serez en mesure de transférer ces connaissances à de nombreuses tâches informatiques courantes, depuis l'exécution de recherches avancées dans votre éditeur de texte jusqu'à la validation des entrées utilisateur.
