Passons maintenant au symbole le plus intéressant que vous utiliserez le plus souvent : le
pipe | (prononcez « païpe », comme un bon Anglais). Son but ? Chaîner des commandes.
Le pipe | n'est pas un symbole qu'on a l'habitude d'écrire. Pourtant, il y en a forcément un sur votre clavier (parfois représenté sous la forme d'une ligne verticale en pointillés).
Sur un clavier AZERTY français par exemple, vous pouvez l'écrire en combinant les touches Alt Gr + 6 et sur un clavier belge, Alt Gr + 1. Sur un clavier Mac, c'est Alt + Shift + L
.
La théorie
« Chaîner des commandes » ? Cela signifie connecter la sortie d'une commande à l'entrée d'une autre commande (comme le montre la figure suivante).
En gros,
tout ce qui sort de la commande1 est immédiatement envoyé à la commande2. Et vous pouvez chaîner des commandes comme cela indéfiniment !
Cette fonctionnalité est vraiment une des plus importantes et décuple littéralement les possibilités offertes par la console.
Souvenez-vous : dans le chapitre précédent,
je vous disais que chaque commande Unix avait un et un seul rôle, mais qu'elle le remplissait bien. Parfois, l'utilité de certaines commandes seules peut paraître limitée, mais celles-ci prennent en général tout leur sens lorsqu'on les combine à d'autres commandes.
La pratique
Voyons quelques cas concrets (on pourrait trouver une infinité d'exemples).
Trier les élèves par nom
Si vous vous souvenez bien, nous avons toujours un fichier
notes.csv qui contient la liste des élèves et leurs notes :
Code : Console | Fabrice,18 / 20,Excellent travail
Mathieu,3 / 20,Nul comme d'hab'
Sophie,14 / 20,En nette progression
Mélanie,9 / 20,Allez presque la moyenne !
Corentin,11 / 20,Pas mal mais peut mieux faire
Albert,20 / 20,Toujours parfait
Benoît,5 / 20,En grave chute |
Avec
cut, on peut récupérer les noms. Avec
sort, on peut les trier par ordre alphabétique. Pourquoi ne pas connecter
cut à
sort pour avoir la liste des noms triés ?
Code : Console | $ cut -d , -f 1 notes.csv | sort
Albert
Benoît
Corentin
Fabrice
Mathieu
Mélanie
Sophie |
Le pipe effectue la connexion entre la sortie de
cut (des noms dans le désordre) et l'entrée de
sort, comme l'illustre la figure suivante.
Trier les répertoires par taille
La commande
du permet d'obtenir la taille de chacun des sous-répertoires du répertoire courant (je vous conseille de vous placer dans votre home en tapant d'abord
cd) :
Code : Console | $ du
4 ./.gnome2_private
40 ./.local/share/Trash/files
4 ./.local/share/Trash/info
12 ./.local/share/Trash
160 ./.local/share
20 ./.local
... |
Deux problèmes : cette liste est parfois très longue et n'est pas triée.
Un problème à la fois. Tout d'abord, on aimerait par exemple avoir cette même liste dans l'ordre décroissant de taille des répertoires pour repérer plus facilement les plus gros d'entre eux qui prennent de la place sur notre disque.
Pour avoir cette liste du plus grand au plus petit, il nous suffit d'écrire :
Code : Console
On envoie tout le contenu de
du à
sort qui se charge de trier les nombres au début de chacune des lignes.
Code : Console | $ du | sort -nr
...
4 ./.evolution/memos/config
4 ./.evolution/calendar/config
4 ./.evolution/cache
4 ./bin |
Problème : comme les plus gros répertoires ont été affichés en premier, et que j'ai beaucoup de sous-répertoires, je dois remonter très haut dans la console pour retrouver les plus gros d'entre eux.
Que diriez-vous de connecter cette sortie à
head ? Cette commande permet de filtrer uniquement les premières lignes qu'elle reçoit, nous l'avons déjà étudiée dans un chapitre précédent.
Code : Console | $ du | sort -nr | head
120920 .
59868 ./.ies4linux
43108 ./.ies4linux/ie6
41360 ./.ies4linux/ie6/drive_c
41248 ./.ies4linux/ie6/drive_c/windows
40140 ./Desktop
34592 ./.ies4linux/ie6/drive_c/windows/system32
16728 ./.ies4linux/downloads
13128 ./.mozilla
13124 ./.mozilla/firefox |
Vous pouvez paramétrer le nombre de résultats affichés avec l'option
-n de
head. Si vous avez oublié comment l'utiliser, retournez lire le cours sur
head, ou consultez le manuel.
Si vous voulez naviguer à travers tous les résultats, vous pouvez connecter la sortie à
less. Cette commande permet d'afficher des résultats page par page ; ça nous est justement utile dans le cas présent où nous avons beaucoup de résultats !
Code : Console
Essayez !
Vous allez vous retrouver avec un affichage de
less, page par page.
Code : Console | 120920 .
59868 ./.ies4linux
43108 ./.ies4linux/ie6
41360 ./.ies4linux/ie6/drive_c
41248 ./.ies4linux/ie6/drive_c/windows
40140 ./Desktop
34592 ./.ies4linux/ie6/drive_c/windows/system32
16728 ./.ies4linux/downloads
13128 ./.mozilla
13124 ./.mozilla/firefox
13112 ./.mozilla/firefox/v5p4a55d.default
12604 ./.ies4linux/downloads/ie6
11808 ./.ies4linux/downloads/ie6/FR
5848 ./.mozilla/firefox/v5p4a55d.default/Cache
3656 ./.ies4linux/ie6/drive_c/windows/profiles
3616 ./.ies4linux/ie6/drive_c/windows/profiles/mateo21
3496 ./.ies4linux/ie6/drive_c/windows/profiles/mateo21/Local Settings
3416 ./.ies4linux/ie6/drive_c/windows/profiles/mateo21/Local Settings/Temporary Internet Files
3408 ./.ies4linux/ie6/drive_c/windows/profiles/mateo21/Local Settings/Temporary Internet Files/Content.IE5
2220 ./.ies4linux/ie6/drive_c/windows/fonts
2012 ./ies4linux-2.99.0.1
: |
Vous pouvez maintenant voir les premiers fichiers (les plus gros) et descendre progressivement vers les fichiers plus petits, page par page avec la touche
Espace ou ligne par ligne, avec la touche
Entrée (ou les flèches du clavier).
Exercice : peut-être avez-vous toujours trop de répertoires sous les yeux et que vous vous intéressez seulement à certains d'entre eux. Pourquoi ne pas filtrer les résultats avec
grep, pour afficher uniquement la taille des répertoires liés à…
Firefox par exemple ?
Lister les fichiers contenant un mot
Allez, un dernier exercice tordu pour finir en beauté.
Avec
grep, on peut connaître la liste des fichiers contenant un mot dans tout un répertoire (option
-r). Le problème est que cette sortie est un peu trop
verbeuse (il y a trop de texte) : il y a non seulement le nom du fichier mais aussi la ligne dans laquelle le mot a été trouvé.
Code : Console | /var/log/installer/syslog:Apr 6 15:14:43 ubuntu NetworkManager: <debug> [1207494883.004888]
/var/log/installer/syslog:Apr 6 15:23:27 ubuntu python: log-output |
Heureusement, le nom du fichier et le contenu de la ligne sont séparés par un deux-points. On connaît
cut, qui permet de récupérer uniquement une partie de la ligne. Il nous permettrait de conserver uniquement le nom du fichier.
Problème : si le même mot a été trouvé plusieurs fois dans un fichier, le fichier apparaîtra en double ! Pour supprimer les doublons, on peut utiliser
uniq, à condition d'avoir bien trié les lignes avec
sort auparavant.
Alors, vous avez une petite idée de la ligne qu'il va falloir écrire ?
Je vous propose de rechercher les fichiers qui contiennent le mot « log » dans le dossier
/var/log. Notez qu'il faudra passer root avec
sudo pour avoir accès à tout le contenu de ce répertoire.
Voici la commande que je vous propose d'utiliser :
Code : Console | sudo grep log -Ir /var/log | cut -d : -f 1 | sort | uniq |
Que fait cette commande ?
- Elle liste tous les fichiers contenant le mot « log » dans /var/log (-I permettant d'exclure les fichiers binaires).
- Elle extrait de ce résultat uniquement les noms des fichiers.
- Elle trie ces noms de fichiers.
- Elle supprime les doublons.
Et voilà le résultat !
Code : Console | $ sudo grep log -Ir /var/log | cut -d : -f 1 | sort | uniq
/var/log/acpid
/var/log/auth.log
/var/log/boot
/var/log/bootstrap.log
/var/log/dist-upgrade/apt-term.log
/var/log/dmesg
/var/log/dmesg.0
/var/log/gdm/
/var/log/installer/partman
/var/log/installer/syslog
/var/log/kern.log.0
/var/log/messages
/var/log/messages.0
/var/log/syslog
/var/log/syslog.0
/var/log/udev
/var/log/Xorg.0.log
/var/log/Xorg.0.log.old
/var/log/Xorg.20.log
/var/log/Xorg.20.log.old
/var/log/Xorg.21.log |
Résumé
Le résumé est simple, et c'est dans sa simplicité qu'il tire toute sa beauté et sa puissance (non, je ne suis pas fou !), comme l'illustre la figure suivante.
S'il y avait un schéma à retenir, ce serait celui-là. Ça tombe bien, c'est le plus simple.
Je vous laisse vous entraîner avec le pipe, nous le réutiliserons très certainement dans les prochains chapitres. Essayez d'inventer des combinaisons ! ;-)
Les espaces avant et après le pipe ne sont en général pas obligatoires, mais je préfère les mettre ici pour une meilleure lisibilité.