103.7 Leçon 2
Certification : |
LPIC-1 |
---|---|
Version : |
5.0 |
Thème : |
103 Commandes GNU et Unix |
Objectif : |
103.7 Recherche dans des fichiers texte avec les expressions régulières |
Leçon : |
2 sur 2 |
Introduction
La transmission de données par une chaîne de commandes groupées permet d’appliquer des filtres complexes basés sur les expressions régulières. Les expressions régulières sont une technique importante utilisée non seulement dans l’administration système, mais aussi dans l’exploration de données (data mining) et les domaines connexes. Deux commandes sont particulièrement adaptées à la manipulation de fichiers et de données textuelles à l’aide d’expressions régulières : grep
et sed
. grep
est un outil de recherche de motifs et sed
est un éditeur de flux. Ces commandes sont utiles en elles-mêmes, mais c’est surtout en travaillant avec d’autres processus qu’elles se distinguent.
La recherche de motifs : grep
L’une des utilisations les plus courantes de grep
consiste à faciliter l’inspection de fichiers longs, en utilisant l’expression régulière comme filtre appliqué à chaque ligne. On peut l’utiliser pour n’afficher que les lignes commençant par un certain terme. Par exemple, grep
peut être utilisé pour examiner un fichier de configuration pour les modules du noyau, en n’affichant que les lignes relatives aux options :
$ grep '^options' /etc/modprobe.d/alsa-base.conf options snd-pcsp index=-2 options snd-usb-audio index=-2 options bt87x index=-2 options cx88_alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2
Le symbole pipe |
peut être utilisé pour rediriger la sortie d’une commande directement vers l’entrée de grep
. L’exemple suivant utilise une expression régulière entre crochets pour sélectionner les lignes de la sortie de fdisk -l
qui commencent par Disk /dev/sda
ou Disk /dev/sdb
:
# fdisk -l | grep '^Disk /dev/sd[ab]' Disk /dev/sda: 320.1 GB, 320072933376 bytes, 625142448 sectors Disk /dev/sdb: 7998 MB, 7998537728 bytes, 15622144 sectors
La simple sélection des lignes avec des correspondances peut être inadaptée à une tâche particulière, ce qui nécessite d’ajuster le comportement de grep
par le biais de ses options. Par exemple, l’option -c
ou --count
demande à grep
d’afficher le nombre de lignes avec des correspondances :
# fdisk -l | grep '^Disk /dev/sd[ab]' -c 2
L’option peut être placée avant ou après l’expression régulière. Voici d’autres options importantes de grep
:
-c
ou--count
-
Au lieu d’afficher les résultats de la recherche, afficher uniquement le nombre total de correspondances dans un fichier donné.
-i
ou--ignore-case
-
Rendre la recherche insensible à la casse.
-f FILE
ou--file=FILE
-
Indiquer un fichier qui contient l’expression régulière à utiliser.
-n
ou--line-number
-
Indiquer le numéro de la ligne.
-v
ou--invert-match
-
Sélectionner toutes les lignes sauf celles qui contiennent des correspondances.
-H
ou--with-filename
-
Afficher également le nom du fichier qui contient la ligne.
-z
ou--null-data
-
Plutôt que de demander à
grep
de traiter les flux de données d’entrée et de sortie comme des lignes séparées (en utilisant le retour à la ligne par défaut), il faut considérer l’entrée ou la sortie comme une séquence de lignes. Lorsque l’on combine la sortie de la commandefind
en utilisant son option-print0
avec la commandegrep
, l’option-z
ou--null-data
devra être utilisée pour traiter le flux de la même manière.
Bien qu’activée par défaut lorsque plusieurs chemins de fichiers sont fournis en entrée, l’option -H
n’est pas activée pour les fichiers individuels. Cela peut s’avérer critique dans certaines situations, comme lorsque grep
est appelé directement par find
, par exemple :
$ find /usr/share/doc -type f -exec grep -i '3d modeling' "{}" \; | cut -c -100 artistic aspects of 3D modeling. Thus this might be the application you are This major approach of 3D modeling has not been supported oce is a C++ 3D modeling library. It can be used to develop CAD/CAM softwares, for instance [FreeCad
Dans cet exemple, find
affiche tous les fichiers sous /usr/share/doc
et transmet chacun à grep
, qui effectue à son tour une recherche insensible à la casse du terme 3d modeling
à l’intérieur de chaque fichier. Le transfert de données vers cut
sert uniquement à limiter la longueur de la sortie à 100 colonnes. Notez cependant qu’il n’y a aucun moyen de savoir de quel fichier proviennent les lignes en question. Ce problème est résolu en ajoutant l’option -H
à grep
:
$ find /usr/share/doc -type f -exec grep -i -H '3d modeling' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support
À présent, on peut identifier les fichiers dans lesquels chaque correspondance a été trouvée. Pour rendre la liste encore plus parlante, les lignes qui précèdent et qui suivent peuvent être ajoutées aux lignes contenant des correspondances :
$ find /usr/share/doc -type f -exec grep -i -H -1 '3d modeling' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p /usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support /usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.
L’option -1
demande à grep
d’inclure une ligne avant et une ligne après lorsqu’il trouve une ligne avec une correspondance. Ces lignes supplémentaires sont appelées lignes contextuelles. Elles sont identifiées dans la sortie par un signe moins après le nom du fichier. Le même résultat peut être obtenu avec -C 1
ou --context=1
. D’autres quantités de lignes de contexte peuvent être indiquées.
Il existe deux programmes complémentaires à grep
: egrep
et fgrep
. Le programme egrep
est équivalent à la commande grep -E
, qui incorpore des fonctionnalités supplémentaires autres que les expressions régulières de base. Par exemple, avec egrep
il est possible d’utiliser des expressions régulières étendues, comme les branches :
$ find /usr/share/doc -type f -exec egrep -i -H -1 '3d (modeling|printing)' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p /usr/share/doc/openscad/RELEASE_NOTES.md-* Support for using 3D-Mouse / Joystick / Gamepad input dev /usr/share/doc/openscad/RELEASE_NOTES.md:* 3D Printing support: Purchase from a print service partne /usr/share/doc/openscad/RELEASE_NOTES.md-* New export file formats: SVG, 3MF, AMF /usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support /usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.
Dans cet exemple, soit 3D modeling
soit 3D printing
correspondra à l’expression, sans tenir compte des majuscules et des minuscules. Pour afficher les seules parties d’un flux de texte qui correspondent à l’expression utilisée par egrep
, utilisez l’option -o
.
Le programme fgrep
est équivalent à grep -F
, c’est-à-dire qu’il ne tient pas compte des expressions régulières. Il est utile dans les recherches simples où le but est de trouver une expression littérale. Dans ce cas, les caractères spéciaux tels que le signe du dollar et le point seront considérés au pied de la lettre et non pas en fonction de leur signification dans une expression régulière.
L’éditeur de flux : sed
Le programme sed
sert à modifier des données textuelles de façon non interactive. Cela signifie que tout le travail d’édition est effectué à partir d’un jeu d’instructions prédéfinies, et non pas en tapant arbitrairement et directement dans un texte affiché à l’écran. En termes modernes, sed
peut être compris comme un analyseur de motifs : lorsqu’un texte est fourni en entrée, il insère un contenu spécifique à des positions prédéfinies ou lorsqu’il trouve une correspondance pour une expression régulière.
Sed, comme son nom le suggère, est parfaitement adapté à l’édition de texte à travers des flux de données (pipelines). Sa syntaxe de base est sed -f SCRIPT
lorsque les instructions d’édition sont stockées dans le fichier SCRIPT
ou sed -e COMMANDS
pour exécuter COMMANDS
directement depuis la ligne de commande. En l’absence de -f
ou de -e
, sed
utilise le premier paramètre non optionnel comme fichier de script. Il est également possible d’utiliser un fichier en entrée en fournissant son chemin comme argument à sed
.
Les instructions sed
sont composées d’un seul caractère, qui peut être précédé d’une adresse ou suivi d’une ou plusieurs options. Elles sont appliquées successivement à chaque ligne. Les adresses peuvent être un numéro de ligne unique, une expression régulière ou une plage de lignes. Par exemple, la première ligne d’un flux de texte peut être supprimée avec 1d
, où 1
spécifie la ligne où la commande de suppression d
sera appliquée. Pour illustrer l’utilisation de sed
, prenons le résultat de la commande factor `seq 12`
, qui renvoie les facteurs premiers des nombres de 1 à 12 :
$ factor `seq 12` 1: 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 7: 7 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
La suppression de la première ligne avec sed
est effectuée par 1d
:
$ factor `seq 12` | sed 1d 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 7: 7 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
Une série de lignes peut être spécifiée avec une virgule de séparation :
$ factor `seq 12` | sed 1,7d 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
On peut utiliser plus d’une instruction dans la même exécution, en les séparant par des points-virgules. Cependant, il est important dans ce cas de les entourer de guillemets pour éviter que le point-virgule ne soit interprété par le shell :
$ factor `seq 12` | sed "1,7d;11d" 8: 2 2 2 9: 3 3 10: 2 5 12: 2 2 3
Dans cet exemple, deux instructions de suppression ont été exécutées, d’abord pour les lignes allant de 1 à 7, puis pour la ligne 11. Une adresse peut également être une expression régulière, de sorte que seules les lignes qui correspondent à cette expression seront affectées par l’instruction :
$ factor `seq 12` | sed "1d;/:.*2.*/d" 3: 3 5: 5 7: 7 9: 3 3 11: 11
L’expression régulière :.*2.*
correspond à toute occurrence du nombre 2 n’importe où après un deux-points, ce qui entraîne la suppression des lignes correspondant à des nombres avec le facteur 2. Avec sed
, tout ce qui est placé entre les barres obliques (/
) est considéré comme une expression régulière et, par défaut, toutes les expressions régulières de base sont supportées. Par exemple, sed -e "/^#/d" /etc/services
affiche le contenu du fichier /etc/services
sans les lignes qui commencent par #
(lignes de commentaires).
L’instruction de suppression d
fait partie de la multitude d’instructions d’édition fournies par sed
. Au lieu de supprimer une ligne, sed
peut la remplacer par un texte donné :
$ factor `seq 12` | sed "1d;/:.*2.*/c REMOVED" REMOVED 3: 3 REMOVED 5: 5 REMOVED 7: 7 REMOVED 9: 3 3 REMOVED 11: 11 REMOVED
L’instruction c REMOVED
remplace simplement une ligne par le texte REMOVED
. Dans notre exemple, chaque ligne dont une partie correspond à l’expression régulière :.*2.*
est affectée par l’instruction c REMOVED
. L’instruction a TEXT
copie le texte indiqué par TEXT
sur une nouvelle ligne après la ligne avec une correspondance. L’instruction r FILE
fait la même chose, mais en copiant le contenu du fichier indiqué par FILE
. L’instruction w
fait le contraire de r
, c’est-à-dire que la ligne sera ajoutée au fichier indiqué.
L’instruction sed
la plus populaire est certainement s/FIND/REPLACE/
. Elle sert à remplacer une correspondance à l’expression régulière FIND
par le texte indiqué par REPLACE
. Par exemple, l’instruction s/hda/sda/
remplace une chaîne de caractères correspondant à l’expression régulière hda
par sda
. Seule la première correspondance trouvée dans la ligne sera remplacée, à moins que l’indicateur g
ne soit placé après l’instruction, comme dans s/hda/sda/g
.
Une étude de cas plus concrète permettra d’illustrer les fonctionnalités de sed
. Admettons qu’une clinique veuille envoyer des textos à ses clients pour leur rappeler leur rendez-vous du lendemain. Un scénario typique s’appuie sur un service professionnel de messagerie instantanée, qui fournit une API permettant d’accéder au système chargé de transmettre les messages. Ces messages proviennent généralement du même système que celui qui exécute l’application contrôlant les rendez-vous des clients, et ils sont déclenchés à une heure précise de la journée ou à la suite d’un autre événement. Dans cette situation hypothétique, l’application pourrait générer un fichier appelé appointments.csv
contenant des données sous forme de tableau avec tous les rendez-vous pour le lendemain, puis utilisé par sed
pour générer les messages texte à partir d’un fichier modèle appelé template.txt
. Les fichiers CSV sont un outil standard pour exporter des données à partir d’une base de données, de sorte que des exemples de rendez-vous peuvent être présentés comme suit :
$ cat appointments.csv "NAME","TIME","PHONE" "Carol","11am","55557777" "Dave","2pm","33334444"
La première ligne contient les intitulés de chaque colonne, qui serviront à faire correspondre les balises du fichier modèle :
$ cat template.txt Hey <NAME>, don't forget your appointment tomorrow at <TIME>.
Les signes inférieur à <
et supérieur à >
ont été placés autour des titres pour les identifier comme des balises. Le script Bash ci-dessous analyse tous les rendez-vous en file d’attente en utilisant template.txt
comme modèle de message :
#! /bin/bash TEMPLATE=`cat template.txt` TAGS=(`sed -ne '1s/^"//;1s/","/\n/g;1s/"$//p' appointments.csv`) mapfile -t -s 1 ROWS < appointments.csv for (( r = 0; r < ${#ROWS[*]}; r++ )) do MSG=$TEMPLATE VALS=(`sed -e 's/^"//;s/","/\n/g;s/"$//' <<<${ROWS[$r]}`) for (( c = 0; c < ${#TAGS[*]}; c++ )) do MSG=`sed -e "s/<${TAGS[$c]}>/${VALS[$c]}/g" <<<"$MSG"` done echo curl --data message=\"$MSG\" --data phone=\"${VALS[2]}\" https://mysmsprovider/api done
Un véritable script de production devrait également gérer l’authentification, la vérification des erreurs et la journalisation, mais l’exemple comporte des fonctionnalités de base pour le moment. Les premières instructions exécutées par sed
ne sont appliquées qu’à la première ligne — l’adresse 1
dans 1s/^"//;1s/","/\n/g;1s/"$//p
— pour supprimer les guillemets de début et de fin — 1s/^"//
et 1s/"$//
— et pour remplacer les séparateurs de champs par un caractère de retour à la ligne : 1s/","/\n/g
. Seule la première ligne est nécessaire pour charger les noms des colonnes, et les lignes non correspondantes seront supprimées par l’option -n
, ce qui nécessite que l’indicateur p
soit placé après la dernière commande sed
pour afficher la ligne correspondante. Les balises sont alors stockées dans la variable TAGS
sous forme de matrice Bash. Une autre matrice Bash est créée par la commande mapfile
pour stocker les lignes qui contiennent les rendez-vous dans la matrice ROWS
.
Une boucle for
est mise en place pour traiter chaque ligne de rendez-vous trouvée dans ROWS
. Ensuite, les guillemets et les séparateurs dans le rendez-vous - le rendez-vous figure dans la variable ${ROWS[$r]}
utilisée comme un here string - sont remplacés par sed
, de la même manière que les commandes utilisées pour charger les balises. Les valeurs séparées du rendez-vous sont alors stockées dans la matrice VALS
, où les indices 0, 1 et 2 correspondent aux valeurs de NAME
, TIME
et PHONE
.
Enfin, une boucle for
imbriquée traverse la matrice TAGS
et remplace chaque balise trouvée dans le modèle par sa valeur correspondante dans VALS
. La variable MSG
contient une copie du modèle affiché, mise à jour par la commande de substitution s/<${TAGS[$c]}>/${VALS[$c]}/g
à chaque passage de la boucle dans TAGS
.
Il en résulte un message du type : "Hey Carol, don’t forget your appointment tomorrow at 11am."
Le message généré peut alors être envoyé sous forme de paramètre dans une requête HTTP avec curl
, en tant que message e-mail ou n’importe quelle autre méthode similaire.
Combiner grep et sed
Les commandes grep
et sed
peuvent être utilisées conjointement lorsque des procédures d’exploration de texte plus complexes s’avèrent nécessaires. En tant qu’administrateur système, vous pouvez être amené à inspecter toutes les tentatives de connexion à un serveur, par exemple. Le fichier /var/log/wtmp
enregistre toutes les connexions et déconnexions, tandis que le fichier /var/log/btmp
enregistre les tentatives de connexion échouées. Ces données sont écrites dans un format binaire, qui peut être lu respectivement avec les commandes last
et lastb
.
La sortie de lastb
affiche non seulement le nom d’utilisateur utilisé dans la tentative de connexion échouée, mais aussi son adresse IP :
# lastb -d -a -n 10 --time-format notime user ssh:notty (00:00) 81.161.63.251 nrostagn ssh:notty (00:00) vmd60532.contaboserver.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 46.6.11.56 pi ssh:notty (00:00) 46.6.11.56 nps ssh:notty (00:00) vmd60532.contaboserver.net narmadan ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net
L’option -d
traduit l’adresse IP en nom d’hôte correspondant. Le nom d’hôte peut fournir des indices sur le fournisseur d’accès ou le service d’hébergement utilisé pour effectuer ces tentatives de connexion douteuses. L’option -a
affiche le nom d’hôte dans la dernière colonne, ce qui facilite le filtrage à appliquer. L’option --time-format notime
supprime l’heure à laquelle la tentative de connexion a eu lieu. La commande lastb
peut mettre un certain temps à se terminer s’il y a eu trop de tentatives de connexion erronées, c’est pourquoi l’affichage a été limité à dix entrées avec l’option -n 10
.
Toutes les adresses IP distantes ne sont pas associées à un nom d’hôte, de sorte que le reverse DNS ne les concerne pas et qu’elles peuvent être ignorées. Même s’il est possible de rédiger une expression régulière qui correspondrait au format attendu pour un nom d’hôte en fin de ligne, il est probablement plus simple d’écrire une regex qui correspond soit à une lettre de l’alphabet, soit à un seul chiffre en fin de ligne. L’exemple ci-dessous montre comment la commande grep
récupère la liste sur l’entrée standard et supprime les lignes qui ne contiennent pas de nom d’hôte :
# lastb -d -a --time-format notime | grep -v '[0-9]$' | head -n 10 nvidia ssh:notty (00:00) vmd60532.contaboserver.net n_tonson ssh:notty (00:00) vmd60532.contaboserver.net nrostagn ssh:notty (00:00) vmd60532.contaboserver.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net nps ssh:notty (00:00) vmd60532.contaboserver.net narmadan ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net
La commande grep
avec l’option -v
n’affiche que les lignes qui ne correspondent pas à l’expression régulière donnée. Une expression régulière correspondant à toute ligne se terminant par un chiffre (c’est-à-dire [0-9]$
) ne retiendra que les entrées sans nom d’hôte. Par conséquent, grep -v '[0-9]$'
n’affichera que les lignes qui se terminent par un nom d’hôte.
Le résultat peut être filtré encore davantage, en ne gardant que le nom de domaine et en supprimant les autres parties de chaque ligne. La commande sed
peut le faire avec une commande de substitution pour remplacer la ligne entière par une référence au nom de domaine :
# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | head -n 10 vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net 132.red-88-20-39.staticip.rima-tde.net 132.red-88-20-39.staticip.rima-tde.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net
La parenthèse échappée dans .* \(.*\)$
indique à sed
de se souvenir de cette partie de la ligne, c’est-à-dire la partie entre le dernier caractère d’espacement et la fin de la ligne. Dans l’exemple, cette partie est référencée avec \1
et utilisée pour remplacer la ligne entière.
Il est clair que la plupart des hôtes distants essaient de se connecter plus d’une fois, ce qui fait que le même nom de domaine se répète. Pour supprimer les entrées récurrentes, il faut d’abord les trier (avec la commande sort
) puis les passer à la commande uniq
:
# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | sort | uniq | head -n 10 116-25-254-113-on-nets.com 132.red-88-20-39.staticip.rima-tde.net 145-40-33-205.power-speed.at tor.laquadrature.net tor.momx.site ua-83-226-233-154.bbcust.telenor.se vmd38161.contaboserver.net vmd60532.contaboserver.net vmi488063.contaboserver.net vmi515749.contaboserver.net
On voit ainsi comment il est possible de combiner une série de commandes pour obtenir le résultat voulu. La liste des noms d’hôtes pourra ensuite être utilisée pour rédiger des règles de pare-feu ou pour prendre d’autres mesures destinées à renforcer la sécurité du serveur.
Exercices guidés
-
La commande
last
affiche une liste des derniers utilisateurs connectés, y compris leurs adresses IP d’origine. Comment pourrait-on utiliser la commandeegrep
pour filtrer les résultats delast
, en affichant uniquement les occurrences d’une adresse IPv4, et en supprimant toute information supplémentaire dans la ligne correspondante ? -
Quelle option doit être utilisée avec
grep
pour filtrer correctement la sortie générée par la commandefind
exécutée avec l’option-print0
? -
La commande
uptime -s
affiche la dernière date à laquelle le système a été démarré, comme dans 2019-08-05 20:13:22. Quel sera le résultat de la commandeuptime -s | sed -e 's/(.*) (.*)/\1/'
? -
Quelle option doit être passée à
grep
pour qu’il compte les lignes correspondantes au lieu de les afficher ?
Exercices d’approfondissement
-
La structure de base d’un fichier HTML commence par les éléments
html
,head
etbody
, par exemple :<html> <head> <title>Site d'actualités</title> </head> <body> <h1>À la une</h1> <p>Informations intéressantes.</p> </body> </html>
Décrivez comment les adresses pourraient être utilisées dans
sed
pour afficher uniquement l’élémentbody
et son contenu. -
Quelle expression
sed
supprimera toutes les balises d’un document HTML, en conservant uniquement le texte rendu ? -
Les fichiers avec l’extension
.ovpn
sont très utilisés pour configurer les clients VPN étant donné qu’ils contiennent non seulement les paramètres, mais aussi le contenu des clés et des certificats pour le client. Ces clés et certificats se trouvent à l’origine dans des fichiers séparés, et doivent donc être copiés dans le fichier.ovpn
. Voici un extrait d’un gabarit.ovpn
:client dev tun remote 192.168.1.155 1194 <ca> ca.crt </ca> <cert> client.crt </cert> <key> client.key </key> <tls-auth> ta.key </tls-auth>
En partant du fait que les fichiers
ca.crt
,client.crt
,client.key
etta.key
se trouvent dans le répertoire courant, comment la configuration du gabarit pourrait-elle être modifiée parsed
de manière à remplacer chaque nom de fichier par son contenu ?
Résumé
Cette leçon présente les deux commandes Linux les plus importantes en rapport avec les expressions régulières : grep
et sed
. Les scripts et les commandes combinées s’appuient sur grep
et sed
pour effectuer toute une série de tâches de filtrage et d’analyse de texte. Voici les étapes de la leçon :
-
Comment utiliser
grep
et ses déclinaisons commeegrep
etfgrep
. -
Comment utiliser
sed
et ses instructions internes pour manipuler du texte. -
Exemples pratiques d’expressions régulières qui utilisent
grep
etsed
.
Réponses aux exercices guidés
-
La commande
last
affiche une liste des derniers utilisateurs connectés, y compris leurs adresses IP d’origine. Comment pourrait-on utiliser la commandeegrep
pour filtrer les résultats delast
, en affichant uniquement les occurrences d’une adresse IPv4, et en supprimant toute information supplémentaire dans la ligne correspondante ?last -i | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
-
Quelle option doit être utilisée avec
grep
pour filtrer correctement la sortie générée par la commandefind
exécutée avec l’option-print0
?L’option
-z
ou--null-data
, comme dansfind . -print0 | grep -z expression
. -
La commande
uptime -s
affiche la dernière date à laquelle le système a été démarré, comme dans 2019-08-05 20:13:22. Quel sera le résultat de la commandeuptime -s | sed -e 's/(.*) (.*)/\1/'
?Une erreur se produira. Par défaut, les parenthèses doivent être échappées pour utiliser les références inverses dans
sed
. -
Quelle option doit être passée à
grep
pour qu’il compte les lignes correspondantes au lieu de les afficher ?L’option
-c
.
Réponses aux exercices d’approfondissement
-
La structure de base d’un fichier HTML commence par les éléments
html
,head
etbody
, par exemple :<html> <head> <title>Site d'actualités</title> </head> <body> <h1>À la une</h1> <p>Informations intéressantes.</p> </body> </html>
Décrivez comment les adresses pourraient être utilisées dans
sed
pour afficher uniquement l’élémentbody
et son contenu.Pour n’afficher que le
body
, les adresses doivent être/<body>/,/<\/body>/
, comme danssed -n -e '/<body>/,/<\/body>/p'
. L’option-n
est fournie àsed
pour qu’il n’affiche pas les lignes par défaut, d’où la commandep
à la fin de l’expressionsed
pour afficher les lignes correspondantes. -
Quelle expression
sed
supprimera toutes les balises d’un document HTML, en conservant uniquement le texte rendu ?L’expression
sed
s/<[^>]*>//g
remplacera tout contenu inclus dans<>
par une chaîne de caractères vide. -
Les fichiers avec l’extension
.ovpn
sont très utilisés pour configurer les clients VPN étant donné qu’ils contiennent non seulement les paramètres, mais aussi le contenu des clés et des certificats pour le client. Ces clés et certificats se trouvent à l’origine dans des fichiers séparés, et doivent donc être copiés dans le fichier.ovpn
. Voici un extrait d’un gabarit.ovpn
:client dev tun remote 192.168.1.155 1194 <ca> ca.crt </ca> <cert> client.crt </cert> <key> client.key </key> <tls-auth> ta.key </tls-auth>
En partant du fait que les fichiers
ca.crt
,client.crt
,client.key
etta.key
se trouvent dans le répertoire courant, comment la configuration du gabarit pourrait-elle être modifiée parsed
de manière à remplacer chaque nom de fichier par son contenu ?La commande
sed -r -e 's/(^[^.]*)\.(crt|key)$/cat \1.\2/e' < client.template > client.ovpn
remplace chaque ligne qui se termine par
.crt
ou.key
par le contenu d’un fichier dont le nom est identique à la ligne. L’option-r
indique àsed
d’utiliser des expressions régulières étendues, tandis quee
à la fin de l’expression indique àsed
de remplacer les correspondances par la sortie de la commandecat \1.\2
. Les références inverses\1
et\2
correspondent au nom du fichier et à l’extension trouvés dans la correspondance.