Si vous utilisez Linux depuis un certain temps, vous connaissez déjà grep (Global Regular Expression Print), un outil de traitement de texte que vous pouvez utiliser pour effectuer des recherches dans des fichiers et des répertoires. Il est très utile dans les mains d’un grand utilisateur de Linux. Cependant, son utilisation sans regex peut limiter ses capacités.
Mais qu’est-ce que Regex ?
Regex est une expression régulière que vous pouvez utiliser pour améliorer la fonctionnalité de recherche de grep. Par définition, Regex est un modèle de filtrage de sortie avancé. Avec de l’entraînement, vous pouvez utiliser les regex de manière efficace, car vous pouvez également les utiliser avec d’autres commandes Linux.
Dans ce tutoriel, nous allons apprendre à utiliser Grep et Regex de manière efficace.
Pré-requis
L’utilisation de grep avec regex nécessite de bonnes connaissances de Linux.
Vous devez également avoir accès à un ordinateur portable ou à un ordinateur équipé du système d’exploitation Linux. Vous pouvez utiliser la distribution Linux de votre choix. Et si vous avez une machine Windows, vous pouvez toujours utiliser Linux avec WSL2. Consultez notre analyse détaillée ici.
L’accès à la ligne de commande/au terminal vous permet d’exécuter toutes les commandes fournies dans notre tutoriel grep/regex.
En outre, vous devez également avoir accès à un ou plusieurs fichiers texte dont vous aurez besoin pour exécuter les exemples. J’ai utilisé ChatGPT pour générer un mur de texte, en lui demandant d’écrire sur la technologie. L’invite que j’ai utilisée est la suivante.
“Générer 400 mots sur la technologie. Vous devez inclure la plupart des technologies. Veillez également à répéter les noms des technologies dans le texte.”
Une fois le texte généré, je l’ai copié-collé et enregistré dans le fichier tech.txt, que nous utiliserons tout au long du tutoriel.
Enfin, une connaissance de base de la commande grep est indispensable. Vous pouvez consulter 16 exemples de commandes grep pour rafraîchir vos connaissances. Nous allons également présenter brièvement la commande grep pour vous aider à démarrer.
Syntaxe et exemples de la commande grep
La syntaxe de la commande grep est simple.
grep -options [regex/motif] [fichiers]
Comme vous pouvez le constater, la commande attend un motif et la liste des fichiers que vous souhaitez exécuter.
Il existe de nombreuses options grep qui modifient ses fonctionnalités. En voici quelques-unes :
- – i : ignorer les cas
- –r : effectuer une recherche récursive
- –w : effectuer une recherche pour trouver uniquement les mots entiers
- –v : affiche toutes les lignes non correspondantes
- –n: affiche tous les numéros de ligne correspondants
- –l : imprime les noms de fichiers
- –-color : affichage des résultats en couleur
- –c : affiche le nombre de correspondances pour le motif utilisé
#1. Recherche d’un mot entier
Vous devrez utiliser l’argument -w avec grep pour rechercher un mot entier. En l’utilisant, vous contournez toutes les chaînes de caractères qui correspondent au motif donné.
grep -w 'tech\|5G' tech.txt
Comme vous pouvez le voir, la commande produit un résultat dans lequel elle recherche deux mots, “5G” et “tech”, dans l’ensemble du texte. Elle les marque ensuite de la couleur rouge.
Ici, le symbole du tuyau | est échappé pour que grep ne le traite pas comme un métacaractère.
#2. Recherche insensible à la casse
Pour effectuer une recherche insensible à la casse, utilisez grep avec l’argument -i .
grep -i 'tech' tech.txt
La commande recherche toute instance insensible à la casse de la chaîne “tech”, qu’il s’agisse d’un mot complet ou d’une partie de ce mot.
#3. Effectuer une recherche sur les lignes qui ne correspondent pas
Pour afficher toutes les lignes qui ne contiennent pas un motif donné, vous devez utiliser l’argument -v.
grep -v 'tech' tech.txt
La sortie affiche toutes les lignes qui ne contiennent pas le mot“tech” Vous verrez également des lignes vides. Ces lignes sont celles qui se trouvent après un paragraphe.
#4. Effectuez une recherche récursive
Pour effectuer une recherche récursive, utilisez l’argument -r avec grep.
grep -R 'error|warning' /var/log/*.log
#Sortie
/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]
/var/log/bootstrap.log:dpkg : warning : parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg' :
/var/log/bootstrap.log:dpkg : warning : parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg' :
/var/log/bootstrap.log:dpkg : warning : parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg' :
/var/log/bootstrap.log:dpkg : warning : parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg' :
/var/log/bootstrap.log:dpkg : warning : ignorer un problème de pré-dépendance !
La commande grep recherche récursivement deux mots, “error” et “warning”, dans le répertoire /var/log. Il s’agit d’une commande pratique pour connaître les avertissements et les erreurs dans les fichiers journaux.
Grep et Regex : Qu’est-ce que c’est et exemples
Comme nous travaillons avec les expressions rationnelles, vous devez savoir qu’elles offrent trois options syntaxiques. Il s’agit de
- Expressions régulières de base (BRE)
- Expressions régulières étendues (ERE)
- Expressions régulières compatibles avec Pearl (PCRE)
La commande grep utilise BRE comme option par défaut. Par conséquent, si vous souhaitez utiliser d’autres modes de regex, vous devrez les mentionner. La commande grep traite également les métacaractères tels quels. Ainsi, si vous utilisez des métacaractères tels que ?, , ), vous devrez les échapper à l’aide de la commande backslash (\).
La syntaxe de grep avec les expressions rationnelles est la suivante.
$ grep [regex] [filenames]
Voyons voir grep et regex en action avec les exemples ci-dessous.
#1. Correspondance de mots littéraux
Pour effectuer une correspondance littérale, vous devez fournir une chaîne de caractères en tant que regex. Après tout, un mot est aussi une regex.
grep "technologies" tech.txt
De la même manière, vous pouvez utiliser les correspondances littérales pour trouver les utilisateurs actuels. Pour ce faire, exécutez
$ grep bash /etc/passwd
#output
root:x:0:0:root:/root:/bin/bash
nitt:x:1000:1000 :,,,:/home/nitt:/bin/bash
Ceci affiche les utilisateurs qui peuvent accéder à bash.
#2. Correspondance d’ancres
La correspondance d’ancre est une technique utile pour les recherches avancées utilisant des caractères spéciaux. Dans les expressions rationnelles, il existe différents caractères d’ancrage que vous pouvez utiliser pour représenter des positions spécifiques dans un texte. Il s’agit notamment de
- le symbole de la caret‘^’ : Le symbole de la caret correspond au début de la chaîne ou de la ligne d’entrée et recherche une chaîne vide.
- le symbole du dollar ‘$‘ : Le symbole du dollar correspond à la fin de la chaîne ou de la ligne de saisie et recherche une chaîne vide.
Les deux autres caractères de correspondance d’ancrage comprennent la limite du mot “\ b” et la limite du non-mot “\ B”.
- limite du mot “\ b” : avec “\ b”, vous pouvez affirmer la position entre un mot et un caractère non verbal. En d’autres termes, il vous permet de faire correspondre des mots complets. Vous éviterez ainsi les correspondances partielles. Vous pouvez également l’utiliser pour remplacer des mots ou compter les occurrences de mots dans une chaîne.
- limite de non-mot \B : c’est l’opposé de la limite de mot \B en regex car elle affirme une position qui n’est pas entre deux mots ou des caractères de non-mot.
Prenons des exemples pour nous faire une idée claire.
grep '^From' tech.txt
Pour utiliser le caret, il faut saisir le mot ou le motif dans la bonne casse. En effet, il est sensible à la casse. Ainsi, si vous exécutez la commande suivante, elle ne renverra rien.
$ grep '^from' tech.txt
De même, vous pouvez utiliser le symbole $ pour trouver la phrase qui correspond à un motif, une chaîne ou un mot donné.
$ grep 'technologie.$' tech.txt
Vous pouvez également combiner les symboles ^ et $. Voyons l’exemple ci-dessous.
$ grep "^De \| technologie.$" tech.txt
Comme vous pouvez le voir, le résultat contient des phrases commençant par “From” et des phrases se terminant par “technology”
#3. Regroupement
Si vous souhaitez rechercher plusieurs motifs à la fois, vous devez utiliser le regroupement. Il vous permet de créer de petits groupes de caractères et de motifs que vous pouvez traiter comme une seule unité. Par exemple, vous pouvez créer un groupe (tech) qui comprend les termes “t”, “e”, “c”, “h”
Pour vous faire une idée plus précise, prenons un exemple.
$ grep 'technol\(ogy\)\?' tech.txt
Avec le regroupement, vous pouvez faire correspondre des motifs répétés, capturer des groupes et rechercher des alternatives.
Recherche d’alternatives avec le regroupement
Voyons un exemple de recherche alternative.
grep "\(tech\|technologie\)" tech.txt
Si vous souhaitez effectuer une recherche sur une chaîne de caractères, vous devez lui passer le symbole de la pipe. C’est ce que nous allons voir dans l’exemple ci-dessous.
$ echo "tech technology technologies technical" | grep "\(tech|technology\)"
#output
"tech technologique technologies techniques"
Groupes capturés, groupes non capturés et motifs répétés
Qu’en est-il des groupes qui capturent et de ceux qui ne capturent pas ?
Vous devez créer un groupe dans l’expression rationnelle et le passer à la chaîne ou à un fichier pour capturer les groupes.
$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output
tech655 tech655nical technologies655 tech655-oriented 655
Et, pour les groupes non capturables, vous devrez utiliser le ? : entre parenthèses.
Enfin, nous avons des motifs répétés. Vous devrez modifier l’expression rationnelle pour vérifier les motifs répétés.
$ echo 'teach tech ttrial tttechno attest' | grep '\(t\ \)'
#output
'teach tech ttrial tttechno attest'
Ici, la regex recherche une ou plusieurs occurrences du caractère ‘t’.
#4. Classes de caractères
Les classes de caractères vous permettent d’écrire facilement des expressions de type regex. Ces classes de caractères utilisent des crochets. Voici quelques-unes des classes de caractères les plus connues
- [:digit :] – 0 à 9 chiffres
- [:alpha :] – caractères alphabétiques
- [:alnum :] – caractères alphanumériques
- [:lower :] – lettres minuscules
- [:upper:] – lettres majuscules
- [:xdigit :] – chiffres hexadécimaux, y compris 0-9, A-F, a-f
- [:blank :] – caractères vides tels que la tabulation ou l’espace
Et ainsi de suite !
Examinons-en quelques-uns en action.
$ grep [[:digit]] tech.txt
$ grep [[:alpha :]] tech.txt
$ grep [[:xdigit :]] tech.txt
#5. Les quantificateurs
Les quantificateurs sont des métacaractères et sont au cœur des expressions rationnelles. Ils vous permettent de faire correspondre des apparences exactes. Examinons-les ci-dessous.
- * → zéro ou plusieurs correspondances
- → une ou plusieurs correspondances
- ? → zéro ou une correspondance
- {x} → x correspondances
- {x, } → x correspondances ou plus
- {x,z} → de x à z correspond à
- {, z} → jusqu’à z correspondances
$ echo 'teach tech ttrial tttechno attest' | grep -E 't '
#output
'teach tech ttrial tttechno attest'
Ici, il recherche les instances du caractère‘t’ pour une ou plusieurs correspondances. Ici, -E correspond à une expression rationnelle étendue (dont nous parlerons plus tard)
#6. Regex étendues
Si vous n’aimez pas ajouter des caractères d’échappement dans le motif de la regex, vous devez utiliser la regex étendue. Cela vous évitera d’ajouter des caractères d’échappement. Pour ce faire, vous devez utiliser l’option -E.
grep -E 'in ovation' tech.txt
#7. Utiliser PCRE pour effectuer des recherches complexes
PCRE (Perl Compatible Regular Expression) vous permet de faire bien plus que d’écrire des expressions basiques. Par exemple, vous pouvez écrire “\d” qui signifie [0-9].
Par exemple, vous pouvez utiliser PCRE pour rechercher des adresses électroniques.
echo "Contactez-moi à nitish@newdomain.com" | grep -P "\b[A-Za-z0-9._% -] @[A-Za-z0-9.-] \.[A-Za-z]{2,}\b"
#output
Contactez-moi à l'adresse nitish@newdomain.com
Ici, PCRE s’assure de la correspondance du motif. De la même manière, vous pouvez utiliser un motif PCRE pour vérifier les motifs de date.
$ echo "Le site Sparkain a été lancé le 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output
Le site Sparkain a été lancé le 2023-07-29
La commande trouve la date au format AAAA-MM-JJ. Vous pouvez la modifier pour qu’elle corresponde à d’autres formats de date.
#8. Alternance
Si vous souhaitez des correspondances alternatives, vous pouvez utiliser les caractères d’échappement (\|).
$ grep -L 'warning\|error' /var/log/*.log
#output
/var/log/alternatives.log
/var/log/bootstrap.log
/var/log/dpkg.log
/var/log/fontconfig.log
/var/log/ubuntu-advantage.log
/var/log/upgrade-policy-changed.log
La sortie répertorie les noms de fichiers contenant “warning” ou “error”
Mot de la fin
Nous arrivons à la fin de notre guide sur grep et les expressions rationnelles. Vous pouvez utiliser grep avec regex de manière extensive pour affiner les recherches. En les utilisant correctement, vous pouvez gagner beaucoup de temps et automatiser de nombreuses tâches, en particulier si vous les utilisez pour écrire des scripts ou utiliser les regex pour effectuer des recherches dans le texte.
Ensuite, consultez les questions et réponses les plus fréquemment posées lors d’entretiens sur Linux.