3.2 Leçon 2
Certification : |
Linux Essentials |
---|---|
Version : |
1.6 |
Thème : |
3 La Puissance de la Ligne de Commande |
Objectif : |
3.2 Recherche et Extraction de données dans des Fichiers |
Leçon : |
2 sur 2 |
Introduction
Dans cette leçon, nous allons examiner les outils qui sont utilisés pour manipuler le texte. Ces outils sont fréquemment utilisés par les administrateurs système ou les programmes pour surveiller ou identifier automatiquement des informations spécifiques récurrentes.
Recherche dans les Fichiers avec grep
Le premier outil dont nous parlerons dans cette leçon est la commande grep
. grep
est l’abréviation de l’expression "global regular expression print" et sa principale fonctionnalité est de rechercher dans des fichiers un motif spécifié. La commande affiche les lignes contenant le motif spécifié, identifié en rouge.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
grep
, comme la plupart des commandes, peut également être modifiée en utilisant des options. Voici les plus courantes :
-i
-
la recherche est insensible à la casse
-r
-
la recherche est récursive (elle recherche dans tous les fichiers du répertoire donné et de ses sous-répertoires)
-c
-
la recherche compte le nombre de résultats
-v
-
inverser la correspondance, pour afficher les lignes qui ne correspondent pas au terme recherché
-E
-
active les expressions régulières étendues (nécessaires à certains méta-caractères plus avancés comme
|
,+
et?
)
La commande grep
dispose de nombreuses autres options utiles. Consultez sa page de manuel pour en savoir plus.
Les Expressions Régulières
Le deuxième outil est très puissant. Il est utilisé pour décrire des morceaux de texte dans les fichiers, également appelés expressions régulières. Les expressions régulières sont extrêmement utiles pour extraire des données de fichiers texte en construisant des motifs. Elles sont couramment utilisées dans les scripts ou lors de la programmation avec des langages de haut niveau, tels que Perl ou Python.
Lorsque vous travaillez avec des expressions régulières, il est très important de garder à l’esprit que chaque caractère compte et que le motif est écrit dans le but de faire correspondre une séquence spécifique de caractères, appelée chaîne de caractères. La plupart des motifs utilisent les symboles ASCII normaux, tels que les lettres, les chiffres, la ponctuation ou d’autres symboles, mais ils peuvent également utiliser des caractères Unicode afin de correspondre à tout autre type de texte.
La liste suivante explique les méta-caractères d’expressions régulières qui sont utilisés pour former les motifs.
.
-
Correspond à un seul caractère (sauf nouvelle ligne)
[abcABC]
-
Fait correspondre un des caractères entre crochets
[^abcABC]
-
Fait correspondre n’importe quel caractère sauf ceux entre crochets
[a-z]
-
Correspond à n’importe quel caractère de la plage
[^a-z]
-
Correspond à n’importe quel caractère sauf ceux de la plage
soleil|lune
-
Trouve l’une ou l’autre des chaînes énumérées
^
-
Début d’une ligne
$
-
Fin de ligne
Toutes les fonctionnalités des expressions régulières peuvent également être implémentées avec grep
. Vous pouvez voir que dans l’exemple ci-dessus, le mot n’est pas entouré de guillemets. Pour éviter que le shell n’interprète le méta-caractère lui-même, il est recommandé que le motif le plus complexe se trouve entre guillemets doubles (" "). Pour des raisons pratiques, nous utiliserons des guillemets doubles lors de la mise en œuvre d’expressions régulières. Les autres guillemets conservent leur fonctionnalité normale, comme nous l’avons vu dans les leçons précédentes.
Les exemples suivants soulignent la fonctionnalité des expressions régulières. Nous aurons besoin de données dans le fichier, c’est pourquoi la prochaine série de commandes ne fait qu’ajouter différentes chaînes de caractères au fichier text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Le premier exemple est une combinaison de recherche dans le fichier sans et avec des expressions régulières. Afin de bien comprendre les expressions régulières, il est très important de montrer la différence. La première commande recherche la chaîne de caractères exacte, n’importe où sur la ligne, tandis que la deuxième commande recherche les ensembles de caractères qui contiennent l’un des caractères entre crochets. Par conséquent, les résultats des commandes sont différents.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
La deuxième série d’exemples montre l’application du méta-caractère de début et de fin de ligne. Il est très important de préciser la nécessité de placer les 2 caractères au bon endroit dans l’expression. Lorsque vous spécifiez le début de la ligne, le méta-caractère doit être avant l’expression, tandis que lorsque vous spécifiez la fin de la ligne, le méta-caractère doit être après l’expression.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
En plus des méta-caractères expliqués précédemment, les expressions régulières ont également des méta-caractères qui permettent la multiplication du motif spécifié précédemment :
*
-
Zéro ou plusieurs occurrences du motif précédent
+
-
Une ou plusieurs occurrences du motif précédent
?
-
Zéro ou une occurrence du motif précédent
Pour les méta-caractères multiplicateurs, la commande ci-dessous recherche une chaîne qui contient ab
, un seul caractère et un ou plusieurs des caractères précédemment trouvés. Le résultat montre que grep
a trouvé la chaîne de caractères aaabbb1
, correspondant à la partie abbb
ainsi qu’à abab2
. Comme le caractère +
est un caractère d’expression régulière étendue, nous devons passer l’option -E
à la commande grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
La plupart des méta-caractères sont explicites, mais ils peuvent devenir délicats à la première utilisation. Les exemples précédents représentent une petite partie de la fonctionnalité des expressions régulières. Essayez tous les méta-caractères du tableau ci-dessus pour mieux comprendre leur fonctionnement.
Exercices Guidés
En utilisant grep
et le fichier /usr/share/hunspell/en_US.dic
, trouvez les lignes qui correspondent aux critères suivants :
-
Toutes les lignes contenant le mot
cat
n’importe où sur la ligne. -
Toutes les lignes qui ne contiennent aucun des caractères suivants :
sawgtfixk
. -
Toutes les lignes qui commencent par 3 lettres quelconques suivi de la chaîne
dig
. -
Toutes les lignes qui se terminent par au moins un
e
. -
Toutes les lignes qui contiennent l’un des mots suivants :
org
,kay
outuna
. -
Le nombre de lignes qui commencent, ou non, par un
c
suivi de la chaîneati
.
Exercices d’Exploration
-
Trouvez l’expression régulière qui correspond aux mots de la ligne “Inclure” et qui ne correspond pas à ceux de la ligne “Exclure” :
-
Inclure :
pot
,spot
,apot
Exclure :
potic
,spots
,potatoe
-
Inclure :
arp99
,apple
,zipper
Exclure :
zoo
,arive
,attack
-
Inclure :
arcane
,capper
,zoology
Exclure :
air
,coper
,zoloc
-
Inclure :
0th/pt
,3th/tc
,9th/pt
Exclure :
0/nm
,3/nm
,9/nm
-
Inclure :
Hawaii
,Dario
,Ramiro
Exclure :
hawaii
,Ian
,Alice
-
-
Quelle autre commande utile est couramment utilisée pour rechercher dans les fichiers ? Quelles sont les fonctionnalités supplémentaires dont elle dispose ?
-
En repensant à la leçon précédente, utilisez un des exemples et essayez de rechercher un motif spécifique dans la sortie de la commande, avec l’aide de
grep
.
Résumé
Dans cet atelier, vous avez appris :
-
Les méta-caractères des expressions régulières
-
Comment créer des motifs avec des expressions régulières
-
Comment rechercher dans les fichiers
Commandes utilisées dans les exercices :
grep
-
Recherche un caractère ou une chaîne de caractères dans un fichier
Réponses aux Exercices Guidés
En utilisant grep
et le fichier /usr/share/hunspell/en_US.dic
, trouvez les lignes qui correspondent aux critères suivants :
-
Toutes les lignes contenant le mot
cat
n’importe où sur la ligne.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Toutes les lignes qui ne contiennent aucun des caractères suivants :
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Toutes les lignes qui commencent par 3 lettres quelconques suivi de la chaîne
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Toutes les lignes qui se terminent par au moins un
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Toutes les lignes qui contiennent l’un des mots suivants :
org
,kay
outuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Le nombre de lignes qui commencent, ou non, par un
c
suivi de la chaîneati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Réponses aux Exercices d’Exploration
-
Trouvez l’expression régulière qui correspond aux mots de la ligne “Inclure” et qui ne correspond pas à ceux de la ligne “Exclure” :
-
Inclure :
pot
,spot
,apot
Exclure :
potic
,spots
,potatoe
Réponse :
pot$
-
Inclure :
arp99
,apple
,zipper
Exclure :
zoo
,arive
,attack
Réponse :
p+
-
Inclure :
arcane
,capper
,zoology
Exclure :
air
,coper
,zoloc
Réponse :
arc|cap|zoo
-
Inclure :
0th/pt
,3th/tc
,9th/pt
Exclure :
0/nm
,3/nm
,9/nm
Réponse :
[0-9]th.+
-
Inclure :
Hawaii
,Dario
,Ramiro
Exclure :
hawaii
,Ian
,Alice
Réponse :
^[A-Z]a.*i+
-
-
Quelle autre commande utile est couramment utilisée pour rechercher dans les fichiers ? Quelles sont les fonctionnalités supplémentaires dont elle dispose ?
La commande
sed
. Cette commande permet de trouver et de remplacer des caractères ou des ensembles de caractères dans un fichier. -
En repensant à la leçon précédente, utilisez un des exemples et essayez de rechercher un motif spécifique dans la sortie de la commande, avec l’aide de
grep
.J’ai pris une des réponses des exercices d’exploration et j’ai cherché la ligne qui a comme autorisation de groupe : lecture, écriture et exécution. Votre réponse peut être différente, selon la commande que vous avez choisie et le motif que vous avez créé.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Cet exercice a pour but de vous montrer que
grep
peut également recevoir des entrées de différentes commandes et qu’il peut aider à filtrer les informations générées.