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 |
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 |
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
-
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
etwc
, affichez le nombre de processeurs dont vous disposez. -
Faites la même chose avec
sed
au lieu degrep
.
-
-
Explorez votre fichier local
/etc/passwd
avec les commandesgrep
,sed
,head
ettail
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
.
-
-
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
(utilisezsed
pour sélectionner le champ approprié) depuis votre fichiermypasswd
. -
Affichez uniquement les noms complets de tous les utilisateurs de ce groupe (utilisez
sed
etcut
).
-
Exercices d’approfondissement
-
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 commandesed
pour afficher uniquement les lignes du bureau principal, puis une séquence de commandescut
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. -
Combien de personnes travaillent dans la finance (
Finance
), l’ingénierie (Engineering
) et les ventes (Sales
) ? (Pensez à utiliser la commandeuniq
). -
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 fichiernames.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
, etpaste
pour obtenir le résultat souhaité. Notez que la virgule (,
) servira de délimiteur pour ce fichier. -
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 utilisantmd5sum
? -
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. -
En utilisant
ls -l
sur le répertoire/etc
, quel genre d’affichage obtenez-vous ? En utilisant la commandecut
sur le résultat de la commandels
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 commandesls -l
etcut
, utilisez la commandetr
pour compacter plusieurs occurrences d’un espace en un seul espace afin de faciliter le formatage de la sortie avec une commandecut
. -
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 commandetail
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
-
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
etwc
, 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 degrep
.Maintenant, au lieu de
grep
, nous allons essayer avecsed
:$ sed -n /processor/p /proc/cpuinfo | wc -l
Ici, nous avons utilisé
sed
avec l’option-n
pour quesed
n’affiche rien sauf ce qui correspond à l’expressionprocessor
, comme indiqué par la commandep
. Comme nous l’avons fait dans les solutions basées surgrep
,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 commandewc
. La différence ici est qu’au lieu d’utiliserwc -l
pour compter le nombre de lignes,sed
est invoqué à nouveau pour fournir une fonctionnalité équivalente. Encore une fois, nous supprimons les résultats desed
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 (=
).
-
-
Explorez votre fichier local
/etc/passwd
avec les commandesgrep
,sed
,head
ettail
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 commandecut
) et le fichier/etc/passwd
utilise des:
comme séparateurs (paramètre-d:
de la commandecut
). Il suffit d’envoyer la sortie de la commandegrep
vers la commandecut
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 unx
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 commandesort
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 commandep
. Le signe dollar ($
) utilisé ici est une expression régulière signifiant la dernière ligne du fichier.
-
-
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
(utilisezsed
pour sélectionner le champ approprié) depuis votre fichiermypasswd
.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
etcut
).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 commandecut
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
-
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 commandesed
pour afficher uniquement les lignes du bureau principal, puis une séquence de commandescut
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 commandesort
. Répétez cette commande plusieurs fois sur votre machine (notez que vous devrez mettre 'Main Office' entre guillemets simples pour quesed
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
-
Combien de personnes travaillent dans la finance (
Finance
), l’ingénierie (Engineering
) et les ventes (Sales
) ? (Pensez à utiliser la commandeuniq
).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 commandesort
. -
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 fichiernames.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
, etpaste
pour obtenir le résultat souhaité. Notez que la virgule (,
) servira de délimiteur pour ce fichier.Commencez avec les commandes
sed
etcut
, en vous basant sur ce que nous avons appris dans les exercices précédents :$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname
Nous voilà avec le fichier
firstname
qui contient les prénoms de nos employés.$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname
Maintenant nous avons le fichier
lastname
avec les noms de famille de chaque employé.Ensuite, nous allons chercher à savoir dans quel département travaille chaque employé :
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department
Avant de travailler sur la solution définitive, essayez les commandes suivantes pour voir quel type de résultat elles génèrent :
$ cat firstname lastname department $ paste firstname lastname department
Et voici le résultat final :
$ paste firstname lastname department | tr '\t' , $ paste firstname lastname department | tr '\t' , > names.csv
Ici, nous utilisons la commande
tr
pour traduire\t
, le séparateur de tabulations, par une virgule.tr
est très utile lorsque nous devons remplacer un caractère par un autre. N’hésitez pas à consulter les pages de manuel detr
etpaste
. Par exemple, nous pouvons utiliser l’option-d
pour le délimiteur afin de simplifier la commande précédente :$ paste -d, firstname lastname department
Nous avons utilisé la commande
paste
ici pour vous familiariser avec elle. Cependant, nous aurions pu facilement effectuer toutes les tâches en un seul enchaînement de commandes :$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
-
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 utilisantmd5sum
?Si vous consultez les pages de manuel de
md5sum
,sha256sum
etsha512sum
, vous verrez qu’elles commencent toutes par le même texte :“calcule et vérifie la somme de contrôle XXX d’un fichier”
Où “XXX” représente l’algorithme qui sera utilisé pour calculer cette somme de contrôle.
Nous allons utiliser
md5sum
pour l’exemple et par la suite vous pourrez essayer avec les autres commandes.$ md5sum names.csv 61f0251fcab61d9575b1d0cbf0195e25 names.csv
Vous pouvez maintenant, à titre d’exemple, mettre le fichier à disposition par le biais d’un service FTP sécurisé et envoyer la somme de contrôle générée par un autre moyen de communication sécurisé. Si le fichier a été légèrement modifié, la somme de contrôle du fichier sera complètement différente. En guise d’illustration, éditez
names.csv
et changez James en Jones comme nous le faisons ici :$ sed -i.backup s/James/Jones/ names.csv $ md5sum names.csv f44a0d68cb480466099021bf6d6d2e65 names.csv
Lorsque vous mettez des fichiers à disposition pour le téléchargement, c’est toujours une bonne pratique de distribuer en même temps une somme de contrôle correspondante afin que les personnes qui téléchargent votre fichier puissent produire une nouvelle somme de contrôle et la vérifier par rapport à l’original. Si vous parcourez https://kernel.org, vous trouverez la page https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc où vous pouvez obtenir les sommes de contrôle SHA256 pour tous les fichiers disponibles au téléchargement.
-
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 decurl
. Utilisezless
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 utilisernl
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. -
En utilisant
ls -l
sur le répertoire/etc
, quel genre d’affichage obtenez-vous ? En utilisant la commandecut
sur le résultat de la commandels
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 commandesls -l
etcut
, utilisez la commandetr
pour compacter plusieurs occurrences d’un espace en un seul espace afin de faciliter le formatage de la sortie avec une commandecut
.La commande
ls
en elle-même vous fournira juste les noms des fichiers. Nous pouvons cependant préparer le résultat de la commandels -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 commandetr
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
-
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 commandetail
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 commandegrep
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 contenantproduct
OUblocks
OUmanufacturer
.