Linux Professional Institute Learning Logo.
Passer au contenu principal
  • Accueil
    • Toutes les ressources
    • Supports de Cours LPI
    • Devenez contributeur
    • Publishing Partners
    • Devenez Partenaire de Publication
    • À propos
    • FAQ
    • Contributeurs
    • Feuille de route
    • Contactez-nous
  • LPI.org
103.2 Leçon 1
Thème 101 : Architecture système
101.1 Détermination et configuration des paramètres du matériel
  • 101.1 Leçon 1
101.2 Démarrage du système
  • 101.2 Leçon 1
101.3 Change runlevels / boot targets and shutdown or reboot system
  • 101.3 Leçon 1
Thème 102 : Installation de Linux et gestion de paquetages
102.1 Conception du schéma de partitionnement
  • 102.1 Leçon 1
102.2 Installation d'un gestionnaire d'amorçage
  • 102.2 Leçon 1
102.3 Gestion des bibliothèques partagées
  • 102.3 Leçon 1
102.4 Utilisation du gestionnaire de paquetage Debian
  • 102.4 Leçon 1
102.5 Utilisation des gestionnaires de paquetage RPM et YUM
  • 102.5 Leçon 1
102.6 Linux en tant que système virtuel hébergé
  • 102.6 Leçon 1
Thème 103 : Commandes GNU et Unix
103.1 Travail en ligne de commande
  • 103.1 Leçon 1
  • 103.1 Leçon 2
103.2 Traitement de flux de type texte avec des filtres
  • 103.2 Leçon 1
103.3 Gestion élémentaire des fichiers
  • 103.3 Leçon 1
  • 103.3 Leçon 2
103.4 Utilisation des flux, des tubes et des redirections
  • Prochainement...
103.5 Création, contrôle et interruption des processus
  • Prochainement...
103.6 Modification des priorités des processus
  • Prochainement...
103.7 Recherche dans des fichiers texte avec les expressions rationnelles
  • Prochainement...
103.8 Édition de fichier simple
  • Prochainement...
Thème 104 : Disques, systèmes de fichiers Linux , arborescence de fichiers standard (FHS)
104.1 Création des partitions et des systèmes de fichiers
  • Prochainement...
104.2 Maintenance de l'intégrité des systèmes de fichiers
  • Prochainement...
104.3 Montage et démontage des systèmes de fichiers
  • Prochainement...
104.5 Gestion des permissions et de la propriété sur les fichiers
  • Prochainement...
104.6 Création et modification des liens physiques et symboliques sur les fichiers
  • Prochainement...
104.7 Recherche de fichiers et placement des fichiers aux endroits adéquats
  • Prochainement...
How to get certified
  1. Thème 103 : Commandes GNU et Unix
  2. 103.2 Traitement de flux de type texte avec des filtres
  3. 103.2 Leçon 1

103.2 Leçon 1

Certification :

LPIC-1

Version :

5.0

Thème :

103 Commandes GNU et Unix

Objectif :

103.2 Traiter les flux de texte avec des filtres

Leçon :

1 sur 1

Introduction

Gérer du texte constitue une part considérable du travail de tout administrateur système. Doug McIlroy, membre de l’équipe de développement initiale d’Unix, a résumé la philosophie d’Unix en disant (entre autres choses importantes) : “Écrivez des programmes pour gérer les flux de texte, car c’est une interface universelle.” Linux est inspiré par le système d’exploitation Unix et en adopte résolument la philosophie. Un administrateur doit donc s’attendre à trouver une multitude d’outils pour manipuler du texte dans une distribution Linux.

Aperçu rapide des redirections et des pipelines

Un autre extrait de la philosophie Unix :

  • Écrivez des programmes qui effectuent une seule chose et qui le font bien.

  • Écrivez des programmes qui collaborent.

L’un des principaux moyens de faire travailler les programmes ensemble passe par les pipelines (tubes de communication) et les redirections. A peu près tous vos programmes de manipulation de texte vont récupérer du texte depuis une entrée standard (stdin), le sortir vers une sortie standard (stdout) et envoyer les erreurs éventuelles vers une sortie d’erreur standard (stderr). Sauf indication contraire, l’entrée standard sera ce que vous tapez sur votre clavier (le programme le lira une fois que vous aurez appuyé sur la touche Entrée). De même, la sortie standard et les erreurs seront affichées sur l’écran de votre terminal. Voyons de plus près comment ça marche.

Dans votre terminal, tapez cat et appuyez sur la touche Entrée. Puis tapez du texte au hasard.

$ cat
This is a test
This is a test
Hey!
Hey!
It is repeating everything I type!
It is repeating everything I type!
(I will hit ctrl+c so I will stop this nonsense)
(I will hit ctrl+c so I will stop this nonsense)
^C

Pour plus de détails sur la commande cat (le terme vient de "concaténer"), n’hésitez pas à lire la page de manuel en ligne correspondante.

Note

Si vous travaillez sur une installation très minimale d’un serveur Linux, certaines commandes comme info et less ne seront peut-être pas disponibles. Si c’est le cas, installez ces programmes en suivant la procédure appropriée pour votre système, comme nous l’avons décrit dans les leçons correspondantes.

Comme nous venons de le voir, si vous ne spécifiez pas où cat doit lire, il lira l’entrée standard (ce que vous tapez) et enverra ce qu’il lit vers votre fenêtre de terminal (sa sortie standard).

Maintenant essayez ce qui suit :

$ cat > mytextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this
^C

$ cat mytextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Le > (plus grand que) indique à cat de rediriger sa sortie vers le fichier mytextfile au lieu de la sortie standard. Maintenant, essayez ceci :

$ cat mytextfile > mynewtextfile
$ cat mynewtextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Cela a pour effet de copier mytextfile vers mynewtextfile. Vous pouvez vérifier que ces deux fichiers ont le même contenu en effectuant un diff :

$ diff mynewtextfile mytextfile

Comme il n’y a pas de résultat, les fichiers sont identiques. Essayez maintenant l’opérateur de redirection pour ajouter des données (>>) :

$ echo 'This is my new line' >> mynewtextfile
$ diff mynewtextfile mytextfile
4d3
< This is my new line

Pour l’instant, nous avons utilisé les redirections pour créer et manipuler des fichiers. Nous pouvons également utiliser les pipelines (représentés par le symbole |) pour rediriger la sortie d’un programme vers un autre programme. Recherchons toutes les lignes où figure le mot “this” :

$ cat mytextfile | grep this
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

$ cat mytextfile | grep -i this
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Ici, nous avons envoyé la sortie de cat vers une autre commande : grep. Notez que lorsque nous ignorons la casse (en utilisant l’option -i), nous obtenons une ligne supplémentaire comme résultat.

Traiter les flux de texte

Lire un fichier compressé

Nous allons créer un fichier nommé ftu.txt qui contient la liste des commandes suivantes :

bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Maintenant, nous allons utiliser la commande grep pour afficher toutes les lignes qui contiennent la chaine de caractères cat :

$ cat ftu.txt | grep cat
bzcat
cat
xzcat
zcat

Une autre façon d’obtenir cette information consiste à utiliser la commande grep pour filtrer le texte directement, sans passer par une autre application pour envoyer le flux de texte vers la sortie standard.

$ grep cat ftu.txt
bzcat
cat
xzcat
zcat
Note

N’oubliez pas qu’il y a plusieurs façons d’effectuer la même tâche sous Linux.

Il existe d’autres commandes qui gèrent les fichiers compressés (bzcat pour les fichiers compressés avec bzip, xzcat pour les fichiers compressés avec xz et zcat pour les fichiers compressés avec gzip) et chacune est utilisée pour visualiser le contenu d’un fichier compressé en fonction de l’algorithme de compression utilisé.

Vérifiez que le fichier ftu.txt nouvellement créé est bien le seul dans le répertoire, puis créez une version compressée du fichier avec gzip :

$ ls ftu*
ftu.txt

$ gzip ftu.txt
$ ls ftu*
ftu.txt.gz

Ensuite, utilisez la commande zcat pour visualiser le contenu du fichier compressé avec gzip :

$ zcat ftu.txt.gz
bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Notez que gzip va compresser ftu.txt en ftu.txt.gz en supprimant le fichier de départ. Par défaut, la commande gzip ne vous retournera rien. Cependant, si vous voulez que gzip affiche ce qu’il fait, utilisez l’option -v pour la sortie "verbeuse".

Afficher un fichier dans un programme de pagination

Vous savez que cat concatène un fichier vers la sortie standard (une fois qu’un fichier est fourni après la commande). Le fichier /var/log/syslog est l’endroit où votre système Linux stocke tout ce qui se passe d’important dans votre système. Utilisez la commande sudo pour acquérir les privilèges nécessaires pour lire le fichier /var/log/syslog :

$ sudo cat /var/log/syslog

Vous allez voir des messages qui défilent très rapidement dans votre fenêtre de terminal. Vous pouvez envoyer la sortie vers le programme less pour afficher les résultats page par page. Avec less, vous pouvez utiliser les touches fléchées pour naviguer dans le résultat ainsi que les raccourcis de type vi pour vous déplacer dans le texte et effectuer des recherches.

Mais plutôt que de passer la commande cat à un programme de pagination, il est plus commode d’utiliser directement le pageur :

$ sudo less /var/log/syslog
... (résultat occulté pour plus de lisibilité)

Récupérer une partie d’un fichier texte

Si vous ne souhaitez examiner que le début ou la fin d’un fichier, il existe d’autres approches. La commande head est utilisée pour lire les dix premières lignes d’un fichier par défaut, et la commande tail est utilisée pour lire les dix dernières lignes d’un fichier par défaut. Maintenant essayez :

$ sudo head /var/log/syslog
Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
$ sudo tail /var/log/syslog
Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal
Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ")
Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor...
Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract'
Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor.
Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907)
Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911)
Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal
Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal
Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.

Afin d’illustrer le nombre de lignes affichées, nous pouvons rediriger la sortie de la commande head vers la commande nl, qui affichera le nombre de lignes de texte transmises à la commande :

$ sudo head /var/log/syslog | nl
1	Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
2	Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
3	Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
4	Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
5	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
6	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
7	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
8	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
9	Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
10	Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)

Et nous pouvons faire de même en redirigeant la sortie de la commande tail vers la commande wc, qui par défaut va compter le nombre de mots dans un document, et en utilisant l’option -l pour afficher le nombre de lignes de texte que la commande a lues :

$ sudo tail /var/log/syslog | wc -l
10

Au cas où un administrateur aurait besoin de voir plus (ou moins) du début ou de la fin d’un fichier, l’option -n pourra être utilisée pour limiter la sortie des commandes :

$ sudo tail -n 5 /var/log/syslog
Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded.
Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ")
Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor...
Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract'
Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor.
$ sudo head -n 12 /var/log/syslog
Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
Nov 12 08:04:30 hypatia vdr: [882] no DVB device found
Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server

Prise en main de l’éditeur de flux sed

Jetons un œil aux autres fichiers, termes et outils dont le nom ne contient pas cat. Nous pouvons faire cela en passant l’option -v à grep, qui demande à la commande de ne sortir que les lignes qui ne contiennent pas cat :

$ zcat ftu.txt.gz | grep -v cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc

La plupart des choses que l’on peut faire avec grep peuvent également être effectuées avec sed — l’éditeur de flux pour filtrer et transformer du texte (comme indiqué dans la page de manuel de sed). Pour commencer, nous allons récupérer notre fichier ftu.txt en décompressant notre archive gzip du fichier :

$ gunzip ftu.txt.gz
$ ls ftu*
ftu.txt

Maintenant, nous pouvons utiliser sed pour afficher les seules lignes qui contiennent la chaîne de caractères cat :

$ sed -n /cat/p < ftu.txt
bzcat
cat
xzcat
zcat

Nous avons utilisé le signe moins que < pour envoyer le contenu du fichier ftu.txt vers notre commande sed. Le mot placé entre les barres obliques (en l’occurrence /cat/) est le terme recherché. L’option -n indique à sed de ne pas générer de résultat (sauf ceux requis ultérieurement par la commande p). Essayez d’exécuter cette même commande sans l’option -n pour voir ce qui se passe. Puis essayez ceci :

$ sed /cat/d < ftu.txt
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc

Si nous n’utilisons pas l’option -n, sed va afficher tout ce qui se trouve dans le fichier à l’exception de ce que le d lui demande de supprimer de sa sortie.

Une utilisation courante de sed consiste à rechercher et remplacer du texte dans un fichier. Admettons que vous vouliez changer chaque occurrence de cat en dog. Vous pouvez utiliser sed pour ce faire en utilisant l’option s qui remplace chaque instance du premier terme, cat, par le second terme, dog :

$ sed s/cat/dog/ < ftu.txt
bzdog
dog
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzdog
zdog

Plutôt que d’utiliser un opérateur de redirection (<) pour passer le fichier ftu.txt à notre commande sed, nous pouvons simplement demander à la commande sed d’agir directement sur le fichier. Nous allons essayer cela en créant à la volée une sauvegarde du fichier original :

$ sed -i.backup s/cat/dog/ ftu.txt
$ ls ftu*
ftu.txt  ftu.txt.backup

L’option -i va effectuer une opération sed directement sur le fichier d’origine. Si vous n’utilisez pas .backup après l’option -i, vous allez simplement modifier votre fichier d’origine. Le texte invoqué après l’option -i va constituer l’extension utilisée pour sauvegarder le fichier original avant les modifications effectuées par sed.

Garantir l’intégrité des données

Nous avons montré à quel point il est facile de manipuler des fichiers sous Linux. Il peut arriver que vous souhaitiez transmettre un fichier à quelqu’un d’autre, et vous voulez être sûr que le destinataire se retrouve avec une copie conforme du fichier original. Une utilisation très courante de cette technique est mise en œuvre lorsque des serveurs de distributions Linux hébergent des images CD ou DVD téléchargeables de leurs logiciels ainsi que des fichiers contenant les sommes de contrôle de ces images disques. Voici un exemple de listing provenant d’un miroir de téléchargement Debian :

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[PARENTDIR] Parent Directory                                      -
[SUM]       MD5SUMS                              2019-09-08 17:46 274
[CRT]       MD5SUMS.sign                         2019-09-08 17:52 833
[SUM]       SHA1SUMS                             2019-09-08 17:46 306
[CRT]       SHA1SUMS.sign                        2019-09-08 17:52 833
[SUM]       SHA256SUMS                           2019-09-08 17:46 402
[CRT]       SHA256SUMS.sign                      2019-09-08 17:52 833
[SUM]       SHA512SUMS                           2019-09-08 17:46 658
[CRT]       SHA512SUMS.sign                      2019-09-08 17:52 833
[ISO]       debian-10.1.0-amd64-netinst.iso      2019-09-08 04:37 335M
[ISO]       debian-10.1.0-amd64-xfce-CD-1.iso    2019-09-08 04:38 641M
[ISO]       debian-edu-10.1.0-amd64-netinst.iso  2019-09-08 04:38 405M
[ISO]       debian-mac-10.1.0-amd64-netinst.iso  2019-09-08 04:38 334M
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Dans le listing ci-dessus, les fichiers ISO de l’installateur Debian sont accompagnés de fichiers texte qui contiennent les sommes de contrôle des fichiers à partir de plusieurs algorithmes (MD5, SHA1, SHA256 et SHA512).

Note

Une somme de contrôle est une valeur dérivée d’un calcul mathématique basé sur une fonction de hachage cryptographique et appliqué à un fichier. Il existe différents types de fonctions de hachage cryptographiques qui varient en robustesse. L’examen attendra de vous que vous soyez familiarisé avec l’utilisation de md5sum, sha256sum et sha512sum.

Une fois que vous avez téléchargé un fichier (par exemple, l’image debian-10.1.0-amd64-netinst.iso), vous devez comparer la somme de contrôle du fichier téléchargé avec une valeur de somme de contrôle donnée.

Voici un exemple pour illustrer notre propos. Nous allons calculer la valeur SHA256 du fichier ftu.txt en utilisant la commande sha256sum :

$ sha256sum ftu.txt
345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c  ftu.txt

La longue chaîne de caractères qui précède le nom du fichier est la somme de contrôle SHA256 de ce fichier texte. Nous allons créer un fichier qui contient cette valeur de manière à pouvoir l’utiliser pour vérifier l’intégrité de notre fichier texte original. Nous pouvons effectuer cette opération avec la même commande sha256sum en redirigeant la sortie vers un fichier :

$ sha256sum ftu.txt > sha256.txt

Maintenant, pour vérifier le fichier ftu.txt, nous allons utiliser la même commande en fournissant le nom du fichier qui contient notre somme de contrôle avec l’option -c :

$ sha256sum -c sha256.txt
ftu.txt: OK

La valeur contenue dans le fichier correspond à la somme de contrôle SHA256 calculée pour notre fichier ftu.txt, comme il fallait s’y attendre. En revanche, si le fichier d’origine était modifié (par exemple, si quelques octets avaient été perdus lors du téléchargement du fichier ou si quelqu’un l’avait délibérément corrompu), la vérification de la somme de contrôle échouerait. Dans ce cas, nous savons que notre fichier est mauvais ou corrompu, et nous ne pouvons pas faire confiance à l’intégrité de son contenu. Pour illustrer notre propos, nous allons ajouter du texte à la fin du fichier :

$ echo "new entry" >> ftu.txt

Nous allons donc tenter de vérifier l’intégrité du fichier :

$ sha256sum -c sha256.txt
ftu.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

Et nous voyons que la somme de contrôle ne correspond pas à ce qui était attendu pour le fichier. Par conséquent, nous ne pouvons pas faire confiance à l’intégrité de ce fichier. Nous pouvons tenter de télécharger une nouvelle copie du fichier, signaler l’échec de la somme de contrôle à l’expéditeur du fichier ou à l’équipe de sécurité du datacenter, en fonction de l’importance du fichier.

Examiner les fichiers de plus près

La commande de dump octal (od) est souvent utilisée pour déboguer des applications et toutes sortes de fichiers. En soi, la commande od va juste afficher le contenu d’un fichier au format octal. Nous pouvons utiliser notre fichier ftu.txt de tout à l’heure pour un peu de pratique avec cette commande :

$ od ftu.txt
0000000 075142 060543 005164 060543 005164 072543 005164 062550
0000020 062141 066012 071545 005163 062155 071465 066565 067012
0000040 005154 062157 070012 071541 062564 071412 062145 071412
0000060 060550 032462 071466 066565 071412 060550 030465 071462
0000100 066565 071412 071157 005164 070163 064554 005164 060564
0000120 066151 072012 005162 067165 070551 073412 005143 075170
0000140 060543 005164 061572 072141 000012
0000151

La première colonne du résultat correspond au décalage des octets dans chaque ligne. Étant donné que od affiche les informations au format octal par défaut, chaque ligne commence par un décalage d’octet de huit bits, suivi de huit colonnes, chacune contenant la valeur octale des données dans cette colonne.

Tip

Rappelez-vous qu’un octet a une longueur de 8 bits.

Pour afficher le contenu d’un fichier au format hexadécimal, utilisez l’option -x :

$ od -x ftu.txt
0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568
0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a
0000040 0a6c 646f 700a 7361 6574 730a 6465 730a
0000060 6168 3532 7336 6d75 730a 6168 3135 7332
0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174
0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78
0000140 6163 0a74 637a 7461 000a
0000151

À présent, chacune des huit colonnes après le décalage des octets est représentée par son équivalent hexadécimal.

Une application pratique de la commande od permet de déboguer les scripts. Par exemple, la commande od peut nous afficher des caractères que l’on ne voit pas normalement et qui existent dans un fichier, comme les sauts de ligne. Nous pouvons utiliser l’option -c, de sorte qu’au lieu d’afficher la notation numérique pour chaque octet, les entrées des colonnes seront affichées avec leurs équivalents en caractères :

$ od -c ftu.txt
0000000   b   z   c   a   t  \n   c   a   t  \n   c   u   t  \n   h   e
0000020   a   d  \n   l   e   s   s  \n   m   d   5   s   u   m  \n   n
0000040   l  \n   o   d  \n   p   a   s   t   e  \n   s   e   d  \n   s
0000060   h   a   2   5   6   s   u   m  \n   s   h   a   5   1   2   s
0000100   u   m  \n   s   o   r   t  \n   s   p   l   i   t  \n   t   a
0000120   i   l  \n   t   r  \n   u   n   i   q  \n   w   c  \n   x   z
0000140   c   a   t  \n   z   c   a   t  \n
0000151

Tous les sauts de ligne dans le fichier sont représentés par le caractère échappé \n. Si vous souhaitez simplement afficher tous les caractères dans un fichier et que vous n’avez pas besoin de voir les informations relatives au décalage des octets, cette colonne peut être supprimée du résultat comme suit :

$ od -An -c ftu.txt
   b   z   c   a   t  \n   c   a   t  \n   c   u   t  \n   h   e
   a   d  \n   l   e   s   s  \n   m   d   5   s   u   m  \n   n
   l  \n   o   d  \n   p   a   s   t   e  \n   s   e   d  \n   s
   h   a   2   5   6   s   u   m  \n   s   h   a   5   1   2   s
   u   m  \n   s   o   r   t  \n   s   p   l   i   t  \n   t   a
   i   l  \n   t   r  \n   u   n   i   q  \n   w   c  \n   x   z
   c   a   t  \n   z   c   a   t  \n

Exercices guidés

  1. Quelqu’un vient de faire don d’un ordinateur portable à votre école et vous souhaitez maintenant installer Linux dessus. Il n’y a pas de manuel et vous avez été contraint de démarrer sur une clé USB sans environnement graphique. Vous disposez d’un shell et vous savez que pour chaque processeur que vous avez, il y aura une ligne correspondante dans le fichier /proc/cpuinfo :

    processor	: 0
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (lignes ignorées)
    
    processor	: 1
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (plus de lignes ignorées)
    • En utilisant les commandes grep et wc, affichez le nombre de processeurs dont vous disposez.

    • Faites la même chose avec sed au lieu de grep.

  2. Explorez votre fichier local /etc/passwd avec les commandes grep, sed, head et tail en fonction des tâches ci-dessous :

    • Quels utilisateurs ont accès à un shell Bash ?

    • Votre système comporte un certain nombre d’utilisateurs destinés à gérer des programmes spécifiques ou à des fins administratives. Ils n’ont pas accès à un shell. Combien d’entre eux existent sur votre système ?

    • Combien d’utilisateurs et de groupes existent sur votre système (rappelez-vous : utilisez uniquement le fichier /etc/passwd) ?

    • Affichez uniquement la première ligne, la dernière ligne et la dixième ligne de votre fichier /etc/passwd.

  3. Prenons cet exemple de fichier /etc/passwd. Recopiez les lignes ci-dessous dans un fichier local nommé mypasswd pour cet exercice.

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin
    libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
    libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
    carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
    dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh
    emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash
    frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash
    grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh
    henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash
    john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
    • Affichez tous les utilisateurs du groupe 1000 (utilisez sed pour sélectionner le champ approprié) depuis votre fichier mypasswd.

    • Affichez uniquement les noms complets de tous les utilisateurs de ce groupe (utilisez sed et cut).

Exercices d’approfondissement

  1. En utilisant à nouveau le fichier mypasswd des exercices ci-dessus, trouvez une commande Bash qui sélectionnera au hasard une personne du bureau principal (Main Office) pour gagner une tombola. Utilisez la commande sed pour afficher uniquement les lignes du bureau principal, puis une séquence de commandes cut pour extraire le prénom de chaque utilisateur de ces lignes. Enfin, vous allez trier ces noms au hasard et afficher uniquement le premier nom de la liste.

  2. Combien de personnes travaillent dans la finance (Finance), l’ingénierie (Engineering) et les ventes (Sales) ? (Pensez à utiliser la commande uniq).

  3. Maintenant vous souhaitez préparer un fichier CSV (Comma Separated Values) afin de pouvoir facilement importer, depuis le fichier mypasswd de l’exemple précédent, le fichier names.csv dans LibreOffice. Le contenu du fichier aura le format suivant :

    First Name,Last Name,Position
    Carol,Smith,Finance
    ...
    John,Chapel,Sales

    Astuce : Utilisez les commandes sed, cut, et paste pour obtenir le résultat souhaité. Notez que la virgule (,) servira de délimiteur pour ce fichier.

  4. Admettons que la feuille de calcul names.csv créée dans l’exercice précédent soit un fichier important et que nous voulions nous assurer que personne ne puisse l’altérer entre le moment où nous l’envoyons à quelqu’un et le moment où notre destinataire le reçoit. Comment assurer l’intégrité de ce fichier en utilisant md5sum ?

  5. Vous vous êtes promis de lire un livre classique à raison de 100 lignes par jour et vous avez décidé de commencer par Mariner and Mystic de Herman Melville. Imaginez une commande en utilisant split pour séparer ce livre en segments de 100 lignes chacun. Pour obtenir le livre en format texte simple, recherchez-le sur https://www.gutenberg.org.

  6. En utilisant ls -l sur le répertoire /etc, quel genre d’affichage obtenez-vous ? En utilisant la commande cut sur le résultat de la commande ls donnée, comment afficheriez-vous uniquement les noms des fichiers ? Qu’en est-il du nom de fichier et du propriétaire du fichier ? En plus des commandes ls -l et cut, utilisez la commande tr pour compacter plusieurs occurrences d’un espace en un seul espace afin de faciliter le formatage de la sortie avec une commande cut.

  7. Cet exercice suppose que vous travaillez sur une machine réelle (pas une machine virtuelle). Vous devez également vous munir d’une clé USB. Consultez les pages de manuel de la commande tail et voyez comment faire pour lire un fichier à la volée au fur et à mesure que du texte y est ajouté. Tout en surveillant la sortie de la commande tail sur le fichier /var/log/syslog, insérez une clé USB. Saisissez la commande complète que vous utiliseriez pour obtenir le produit (Product), le fabricant (Manufacturer) et la quantité totale de mémoire de votre clé USB.

Résumé

La gestion des flux de texte est d’une importance capitale pour l’administration de n’importe quel système Linux. Les flux de texte peuvent être traités à l’aide de scripts pour automatiser les tâches quotidiennes ou pour trouver des informations de débogage pertinentes dans les fichiers journaux. Voici un aperçu des commandes abordées dans cette leçon :

cat

Utilisé pour combiner ou pour lire des fichiers texte simples.

bzcat

Permet le traitement ou la lecture de fichiers compressés avec bzip2.

xzcat

Permet le traitement ou la lecture de fichiers compressés avec xz.

zcat

Permet le traitement ou la lecture de fichiers compressés avec gzip.

less

Cette commande affiche le contenu d’un fichier page par page et permet également la navigation et la recherche.

head

Cette commande affiche les 10 premières lignes d’un fichier par défaut. L’option -n permet d’afficher moins ou plus de lignes.

tail

Cette commande affiche les 10 dernières lignes d’un fichier par défaut. L’option -n permet d’afficher moins ou plus de lignes. L’option -f est utilisée pour afficher à la volée la sortie d’un fichier texte au fur et à mesure que de nouvelles données y sont inscrites.

wc

Abréviation de “word count” mais selon les options que vous utilisez, il pourra compter les caractères, les mots et les lignes.

sort

Utilisé pour classer le contenu d’un listing par ordre alphabétique, inverse ou aléatoire.

uniq

Utilisé pour recenser (et compter) les chaînes de caractères correspondantes.

od

La commande “octal dump” est utilisée pour afficher un fichier binaire en notation octale, décimale ou hexadécimale.

nl

La commande “number line” va afficher le nombre de lignes dans un fichier et recréer un fichier avec chaque ligne précédée de son numéro de ligne.

sed

L’éditeur de flux peut être utilisé pour trouver les occurrences correspondantes de chaînes de caractères à l’aide d’expressions régulières, ainsi que pour éditer des fichiers à l’aide de motifs prédéfinis.

tr

Cette commande permet de remplacer des caractères et de supprimer ou compresser des caractères récurrents.

cut

Cette commande permet de générer des colonnes de texte sous forme de champs basés sur le délimiteur de caractères du fichier.

paste

Joindre les fichiers en colonnes en fonction de l’utilisation des séparateurs de champs.

split

Cette commande permet de scinder des fichiers volumineux en plusieurs petits fichiers en fonction des critères définis par les options de la commande.

md5sum

Utilisé pour calculer la valeur de hachage MD5 d’un fichier. Également utilisé pour vérifier un fichier par rapport à une valeur de hachage existante afin de garantir son intégrité.

sha256sum

Utilisé pour calculer la valeur de hachage SHA256 d’un fichier. Également utilisé pour vérifier un fichier par rapport à une valeur de hachage existante afin de garantir son intégrité.

sha512sum

Utilisé pour calculer la valeur de hachage SHA512 d’un fichier. Également utilisé pour vérifier un fichier par rapport à une valeur de hachage existante afin de garantir son intégrité.

Réponses aux exercices guidés

  1. Quelqu’un vient de faire don d’un ordinateur portable à votre école et vous souhaitez maintenant installer Linux dessus. Il n’y a pas de manuel et vous avez été contraint de démarrer sur une clé USB sans environnement graphique. Vous disposez d’un shell et vous savez que pour chaque processeur que vous avez, il y aura une ligne correspondante dans le fichier /proc/cpuinfo :

    processor	: 0
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (lignes ignorées)
    
    processor	: 1
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (plus de lignes ignorées)
    • En utilisant les commandes grep et wc, affichez le nombre de processeurs dont vous disposez.

      Voici deux possibilités :

      $ cat /proc/cpuinfo | grep processor | wc -l
      $ grep processor /proc/cpuinfo | wc -l

      Maintenant que vous savez qu’il existe plusieurs façons de faire la même chose, à quel moment devez-vous utiliser l’une ou l’autre ? Cela dépend en fait de plusieurs facteurs, les deux plus importants étant la performance et la lisibilité. La plupart du temps, vous utiliserez des commandes shell à l’intérieur de scripts shell pour automatiser vos tâches. Plus vos scripts sont volumineux et complexes, plus vous devez vous soucier de leur rapidité.

    • Faites la même chose avec sed au lieu de grep.

      Maintenant, au lieu de grep, nous allons essayer avec sed :

      $ sed -n /processor/p /proc/cpuinfo | wc -l

      Ici, nous avons utilisé sed avec l’option -n pour que sed n’affiche rien sauf ce qui correspond à l’expression processor, comme indiqué par la commande p. Comme nous l’avons fait dans les solutions basées sur grep, wc -l va compter le nombre de lignes et donc le nombre de processeurs que nous avons.

      Regardez bien le prochain exemple :

      $ sed -n /processor/p /proc/cpuinfo | sed -n '$='

      Cette séquence de commandes fournit le même résultat que dans l’exemple précédent où la sortie de sed était envoyée vers la commande wc. La différence ici est qu’au lieu d’utiliser wc -l pour compter le nombre de lignes, sed est invoqué à nouveau pour fournir une fonctionnalité équivalente. Encore une fois, nous supprimons les résultats de sed avec l’option -n à l’exception de l’expression que nous appelons explicitement, en l’occurrence '$='. Cette expression demande à sed de rechercher la dernière ligne ($) et affiche le numéro de cette ligne (=).

  2. Explorez votre fichier local /etc/passwd avec les commandes grep, sed, head et tail en fonction des tâches ci-dessous :

    • Quels utilisateurs ont accès à un shell Bash ?

      $ grep ":/bin/bash$" /etc/passwd

      Nous allons améliorer cette réponse en affichant uniquement le nom de l’utilisateur qui utilise le shell Bash.

      $ grep ":/bin/bash$" /etc/passwd | cut -d: -f1

      Le nom d’utilisateur est le premier champ (paramètre -f1 de la commande cut) et le fichier /etc/passwd utilise des : comme séparateurs (paramètre -d: de la commande cut). Il suffit d’envoyer la sortie de la commande grep vers la commande cut appropriée.

    • Votre système comporte un certain nombre d’utilisateurs destinés à gérer des programmes spécifiques ou à des fins administratives. Ils n’ont pas accès à un shell. Combien d’entre eux existent sur votre système ?

      Le moyen le plus simple de le savoir est d’afficher les lignes correspondant aux comptes qui n’utilisent pas le shell Bash :

      $ grep -v ":/bin/bash$" /etc/passwd | wc -l
    • Combien d’utilisateurs et de groupes existent sur votre système (rappelez-vous : utilisez uniquement le fichier /etc/passwd) ?

      Le premier champ de chaque ligne de votre fichier /etc/passwd est le nom de l’utilisateur, le second est généralement un x indiquant que le mot de passe de l’utilisateur n’est pas stocké ici (il est chiffré dans le fichier /etc/shadow). Le troisième est l’identifiant de l’utilisateur (UID) et le quatrième est l’identifiant du groupe (GID). Ceci devrait donc nous donner le nombre d’utilisateurs :

      $ cut -d: -f3 /etc/passwd | wc -l

      Disons que c’est vrai dans la plupart des cas. Cependant, il y a des situations où vous définirez différents super-utilisateurs ou d’autres types d’utilisateurs spéciaux partageant le même UID. Donc, pour être sûr, nous allons passer le résultat de notre commande cut à la commande sort et ensuite compter le nombre de lignes.

      $ cut -d: -f3 /etc/passwd | sort -u | wc -l

      Maintenant, pour le nombre de groupes :

      $ cut -d: -f4 /etc/passwd | sort -u | wc -l
    • Affichez uniquement la première ligne, la dernière ligne et la dixième ligne de votre fichier /etc/passwd.

      Cela fera l’affaire :

      $ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd

      Rappelez-vous que le paramètre -n indique à sed de ne pas imprimer autre chose que ce qui est spécifié par la commande p. Le signe dollar ($) utilisé ici est une expression régulière signifiant la dernière ligne du fichier.

  3. Prenons cet exemple de fichier /etc/passwd. Recopiez les lignes ci-dessous dans un fichier local nommé mypasswd pour cet exercice.

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin
    libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
    libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
    carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
    dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh
    emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash
    frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash
    grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh
    henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash
    john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
    • Affichez tous les utilisateurs du groupe 1000 (utilisez sed pour sélectionner le champ approprié) depuis votre fichier mypasswd.

      Le GID est le quatrième champ du fichier /etc/passwd. Vous pourriez être tenté d’essayer ceci :

      $ sed -n /1000/p mypasswd

      Dans ce cas, vous obtiendrez également cette ligne :

      carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash

      Vous savez que ce n’est pas correct puisque Carol Smith est membre du GID 2000 et que la correspondance a été établie grâce à l’UID. Cependant, vous avez peut-être remarqué qu’après le GID, le champ suivant commence par une majuscule. Nous pouvons utiliser une expression régulière pour résoudre ce problème.

      $ sed -n /:1000:[A-Z]/p mypasswd

      L’expression [A-Z] correspondra à n’importe quel caractère majuscule unique. Vous en apprendrez davantage dans la leçon correspondante.

    • Affichez uniquement les noms complets de tous les utilisateurs de ce groupe (utilisez sed et cut).

      Utilisez la même technique que vous avez utilisée pour résoudre la première partie de cet exercice et envoyez le résultat vers une commande cut.

      $ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5
      Dave Edwards,Finance,,,Main Office
      Emma Jones,Finance,,,Main Office
      Frank Cassidy,Finance,,,Main Office
      Grace Kearns,Engineering,,,Main Office
      Henry Adams,Sales,,,Main Office
      John Chapel,Sales,,,Main Office

      Nous y sommes presque ! Notez que les champs dans les résultats peuvent être séparés par des virgules ,. Nous allons donc renvoyer la sortie vers une autre commande cut en utilisant la virgule , comme délimiteur.

      $ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1
      Dave Edwards
      Emma Jones
      Frank Cassidy
      Grace Kearns
      Henry Adams
      John Chapel

Réponses aux exercices d’approfondissement

  1. En utilisant à nouveau le fichier mypasswd des exercices ci-dessus, trouvez une commande Bash qui sélectionnera au hasard une personne du bureau principal (Main Office) pour gagner une tombola. Utilisez la commande sed pour afficher uniquement les lignes du bureau principal, puis une séquence de commandes cut pour extraire le prénom de chaque utilisateur de ces lignes. Enfin, vous allez trier ces noms au hasard et afficher uniquement le premier nom de la liste.

    Tout d’abord, voyez l’effet de l’option -R sur la sortie de la commande sort. Répétez cette commande plusieurs fois sur votre machine (notez que vous devrez mettre 'Main Office' entre guillemets simples pour que sed le traite comme une seule chaîne) :

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R

    Voici une solution à ce problème :

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
  2. Combien de personnes travaillent dans la finance (Finance), l’ingénierie (Engineering) et les ventes (Sales) ? (Pensez à utiliser la commande uniq).

    Développez ce que vous avez appris dans les exercices précédents. Essayez ceci :

    $ sed -n /'Main Office'/p mypasswd
    $ sed -n /'Main Office'/p mypasswd | cut -d, -f2

    Notez à présent que nous ne nous soucions pas du caractère : comme délimiteur. Nous recherchons juste le deuxième champ lorsque nous séparons les lignes par les virgules ,.

    $ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c
          4 Finance
          1 Engineering
          2 Sales

    La commande uniq n’affiche que les lignes uniques (pas les lignes répétées) et l’option -c indique à uniq de compter les occurrences de lignes identiques. Faites bien attention : uniq ne prend en compte que les lignes adjacentes. Dans le cas contraire, vous devrez utiliser la commande sort.

  3. Now you want to prepare a CSV (comma separated values) file so you can easily import, from the mypasswd file in the previous example, the file names.csv into LibreOffice. The file contents will have the following format:

    First Name,Last Name,Position
    Carol,Smith,Finance
    ...
    John,Chapel,Sales

    Tip: Use the sed, cut, and paste commands to achieve the desired results. Note that the comma (,) will be the delimiter for this file.

    Start with the sed and cut commands, building on top of what we learned from the previous exercises:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname

    Now we have the file firstname with the first names of our employees.

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname

    Now we have the file lastname containing the surnames of each employee.

    Next we determine which department each employee works in:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department

    Before we work on the final solution, try the following commands to see what type of output they generate:

    $ cat firstname lastname department
    $ paste firstname lastname department

    And now for the final solution:

    $ paste firstname lastname department | tr '\t' ,
    $ paste firstname lastname department | tr '\t' , > names.csv

    Here we use the command tr to translate \t, the tab separator, by a ,. tr is quite useful when we need to exchange one character for another. Be sure to review the man pages for both tr and paste. For example, we can use the -d option for the delimiter to make the previous command less complex:

    $ paste -d, firstname lastname department

    We used the paste command here once we needed to get you familiar with it. However we could have easily performed all of the tasks in a single command chain:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
  4. Suppose that the names.csv spreadsheet created in the previous exercise is an important file and we want to make sure nobody will tamper with it from the moment we send it to someone and the moment our recipient receives it. How can we insure the integrity of this file using md5sum?

    If you look into the man pages for md5sum, sha256sum and sha512sum you will see they all start with the following text:

    “compute and check XXX message digest”

    Where “XXX” is the algoritm that will be used to create this message digest.

    We will use md5sum as an example and later you can try with the other commands.

    $ md5sum names.csv
    61f0251fcab61d9575b1d0cbf0195e25  names.csv

    Now, for instance, you can make the file available through a secure ftp service and send the generated message digest using another secure means of communication. If the file has been slightly modified the message digest will be completely different. Just to prove it, edit names.csv and change Jones to James as demonstrated here:

    $ sed -i.backup s/Jones/James/ names.csv
    $ md5sum names.csv
    f44a0d68cb480466099021bf6d6d2e65  names.csv

    Whenever you make files available for download, it is always a good practice to also distribute a message digest correspondent so people who download your file can produce a new message digest and check against the original. If you browse through https://kernel.org you will find the page https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc where you can obtain the sha256sum for all files available for download.

  5. Vous vous êtes promis de lire un livre classique à raison de 100 lignes par jour et vous avez décidé de commencer par Mariner and Mystic de Herman Melville. Imaginez une commande en utilisant split pour séparer ce livre en segments de 100 lignes chacun. Pour obtenir le livre en format texte simple, recherchez-le sur https://www.gutenberg.org.

    Tout d’abord, nous allons récupérer le livre dans son intégralité sur le site du Projet Gutenberg, où vous pouvez télécharger ce livre et d’autres ouvrages disponibles dans le domaine public.

    $ wget https://www.gutenberg.org/files/50461/50461-0.txt

    Vous devrez peut-être installer wget s’il n’est pas déjà présent sur votre système. Alternativement, vous pouvez aussi vous servir de curl. Utilisez less pour vérifier le livre :

    $ less 50461-0.txt

    Nous allons maintenant découper le livre en plusieurs morceaux de 100 lignes chacun :

    $ split -l 100 -d 50461-0.txt melville

    50461-0.txt est le fichier que nous allons découper. melville sera le préfixe pour les fichiers scindés. L’option -l 100 spécifie le nombre de lignes et l’option -d indique à split de numéroter les fichiers (en utilisant le suffixe fourni). Vous pouvez utiliser nl sur n’importe lequel des fichiers découpés (probablement pas sur le dernier) et confirmer que chacun d’entre eux compte une centaine de lignes.

  6. En utilisant ls -l sur le répertoire /etc, quel genre d’affichage obtenez-vous ? En utilisant la commande cut sur le résultat de la commande ls donnée, comment afficheriez-vous uniquement les noms des fichiers ? Qu’en est-il du nom de fichier et du propriétaire du fichier ? En plus des commandes ls -l et cut, utilisez la commande tr pour compacter plusieurs occurrences d’un espace en un seul espace afin de faciliter le formatage de la sortie avec une commande cut.

    La commande ls en elle-même vous fournira juste les noms des fichiers. Nous pouvons cependant préparer le résultat de la commande ls -l (la liste détaillée) pour extraire des informations plus spécifiques.

    $ ls -l /etc | tr -s ' ' ,
    drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi
    -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf
    -rw-r--r--,1,root,root,10,out,2,17:38,adjtime
    drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives
    -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab
    -rw-r--r--,1,root,root,433,out,1,2017,apg.conf
    drwxr-xr-x,6,root,root,4096,dez,17,2018,apm
    drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor
    drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d

    L’option -s indique à tr de réduire les espaces consécutifs en un seul espace. La commande tr fonctionne pour tout type de caractère répétitif que vous spécifiez. Ensuite, nous remplaçons les espaces par une virgule ,. Nous n’avons pas besoin de remplacer les espaces dans notre exemple, nous allons donc simplement omettre les ,.

    $ ls -l /etc | tr -s ' '
    drwxr-xr-x 3 root root 4096 out 24 16:58 acpi
    -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf
    -rw-r--r-- 1 root root 10 out 2 17:38 adjtime
    drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives
    -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab
    -rw-r--r-- 1 root root 433 out 1 2017 apg.conf
    drwxr-xr-x 6 root root 4096 dez 17 2018 apm
    drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor

    Si je ne veux que les noms de fichiers, il suffit d’afficher le neuvième champ :

    $ ls -l /etc | tr -s ' ' | cut -d" " -f9

    Pour le nom du fichier et son propriétaire, nous aurons besoin du neuvième et du troisième champ :

    $ ls -l /etc | tr -s ' ' | cut -d" " -f9,3

    Et si nous avons juste besoin du nom des répertoires et de leur propriétaire ?

    $ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
  7. Cet exercice suppose que vous travaillez sur une machine réelle (pas une machine virtuelle). Vous devez également vous munir d’une clé USB. Consultez les pages de manuel de la commande tail et voyez comment faire pour lire un fichier à la volée au fur et à mesure que du texte y est ajouté. Tout en surveillant la sortie de la commande tail sur le fichier /var/log/syslog, insérez une clé USB. Saisissez la commande complète que vous utiliseriez pour obtenir le produit (Product), le fabricant (Manufacturer) et la quantité totale de mémoire de votre clé USB.

    $ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer'
    Nov  8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade
    Nov  8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk
    Nov  8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)

    Bien entendu, ceci n’est qu’un exemple et les résultats peuvent varier en fonction du fabricant de votre clé USB. Notez l’utilisation de l’option -i avec la commande grep car nous ne sommes pas sûrs que les chaînes de caractères que nous recherchons soient en majuscules ou en minuscules. Nous avons également utilisé le | comme un OU logique. Nous recherchons donc les lignes contenant product OU blocks OU manufacturer.

Linux Professional Insitute Inc. Tous droits réservés. Visitez le site web du projet _Learning_ : https://learning.lpi.org
Ce travail est sous licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.

Prochaine leçon

103.3 Gestion élémentaire des fichiers (103.3 Leçon 1)

Lire la prochaine leçon

Linux Professional Insitute Inc. Tous droits réservés. Visitez le site web du projet _Learning_ : https://learning.lpi.org
Ce travail est sous licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.

LPI est une organisation à but non lucratif.

© 2023 Le Linux Professional Institute (LPI) est la référence mondiale en matière de certification et un organisme de soutien aux professionnels de l'Open Source. Avec plus de 200 000 certifiés à son actif, c'est le principal organisme de certification indépendant pour Linux et l'Open Source au monde. Le LPI a certifié des professionnels dans plus de 180 pays, organise des examens en plusieurs langues et compte des centaines de partenaires pour la formation.

Notre objectif est la création d'opportunités économiques et créatives pour tous en rendant accessible au monde entier la certification des connaissances et des compétences en matière d'Open Source.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Contactez-nous
  • Politique en matière de confidentialité et de cookies

Vous avez repéré une erreur ou vous voulez aider à améliorer cette page ? Faites-nous savoir.

© 1999–2023 The Linux Professional Institute Inc. Tous droits réservés.