Je suis désolé de vous informer, mais la ligne de commande n'a pas disparu avec les dinosaures, ni n'a disparu avec le dodo ou le pigeon voyageur. La ligne de commande Linux est bien vivante et continue de fonctionner. C'est un moyen efficace de collecter et de traiter rapidement des informations, de créer de nouveaux scripts et de configurer des systèmes.
L'un des opérateurs shell les plus puissants est le tube (|
). Le tube prend la sortie d'une commande et l'utilise comme entrée pour une autre. De plus, vous n'êtes pas limité à une seule commande canalisée :vous pouvez les empiler autant de fois que vous le souhaitez, ou jusqu'à ce que vous manquiez de descripteurs de sortie ou de fichier.
L'un des principaux objectifs de la tuyauterie est le filtrage. Vous utilisez la canalisation pour filtrer le contenu d'un fichier volumineux, pour rechercher une chaîne ou un mot particulier, par exemple. C'est pourquoi l'utilisation la plus courante des canaux implique les commandes grep
et sort
. Mais, vous n'êtes pas limité à ces cas. Vous pouvez diriger la sortie vers n'importe quelle commande qui accepte l'entrée de flux. Prenons un exemple théorique pour illustrer le fonctionnement de ce processus :
$ cmd1 | cmd2
Les deux cmd1
et cmd2
sont des utilitaires de ligne de commande qui affichent leurs résultats à l'écran (stdout
). Cependant, lorsque vous dirigez la sortie d'une commande vers une autre, les informations de cmd1
ne produit pas de sortie à l'écran. Le tube redirige cette sortie en entrée vers cmd2
.
Remarque : Ne confondez pas pipe (
|
) redirection avec redirection de fichier (>
) et (<
). (Un exemple de redirection de fichier :cmd1 > file
oucmd1 < file
.) La redirection de fichier envoie la sortie vers un fichier au lieu de l'écran, ou extrait l'entrée d'un fichier.
Examinons quelques exemples concrets du fonctionnement de la tuyauterie.
Vérification des cartes réseau
Supposons que vous ayez besoin de savoir si l'une de vos cartes d'interface réseau (NIC) a une adresse IP commençant par 192 :
$ ifconfig | grep 192
inet 192.168.1.96 netmask 255.255.255.0 broadcast 192.168.1.255
Vous pouvez également savoir quelles cartes réseau actives vous avez sur un système avec un simple tuyau vers grep
:
$ ifconfig | grep UP
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
Vous pouvez également grep pour "RUNNING" ou "RUN" pour afficher les mêmes informations.
Examiner les autorisations
Peut-être voulez-vous savoir combien de répertoires sous /etc
sont accessibles en écriture par root :
$ sudo ls -lR | grep drwx
Les résultats sont trop longs pour être listés ici, mais comme vous pouvez le voir sur votre liste affichée, il y en a beaucoup. Encore faut-il savoir combien il y en a, et un décompte visuel prendrait beaucoup de temps. Une option simple consiste à canaliser les résultats de votre ls
commande au wc
commande (nombre de mots) :
$ sudo ls -lR | grep drwx | wc -l
285
Le -l
commutateur affiche le nombre de lignes. Votre compte peut être différent. Cette liste provient d'une nouvelle installation "RHEL 8 server no GUI".
[Vous voulez essayer Red Hat Enterprise Linux ? Téléchargez-le maintenant gratuitement.]
Comptage des fichiers
Vous n'êtes pas obligé d'utiliser grep
tout le temps. Par exemple, vous pouvez lister le nombre de fichiers dans le /etc
répertoire avec ceci :
$ ls | wc -l
229
Encore une fois, vos résultats peuvent sembler différents, mais vous savez que quelque chose ne va pas si la commande renvoie un petit nombre de fichiers.
Identifier les processus
Vous pouvez également effectuer des tâches complexes à l'aide de tuyaux. Pour répertorier les ID de processus (PID) pour tous les systemd
-processus liés :
$ ps -ef | grep systemd | awk '{ print $2 }'
1
471
500
608
631
7449
7494
17242
Le awk
$2
de la commande la sortie isole la deuxième colonne (PID) du ps
commande. Notez que la dernière entrée, PID 17242
, est en fait le PID pour le grep
commande affichant ces informations, comme vous pouvez le voir dans les résultats de la liste complète ici :
khess 17242 7505 0 09:40 pts/0 00:00:00 grep --color=auto systemd
Pour supprimer cette entrée de vos résultats, utilisez à nouveau l'opérateur pipe :
$ ps -ef | grep systemd | awk '{ print $2 }' | grep -v grep
Le -v
switch indique au grep
commande pour inverser ou ignorer les lignes contenant la chaîne qui suit, dans ce cas toute ligne contenant le mot "grep".
Trier les résultats
Une autre utilisation courante de l'opérateur pipe consiste à trier vos résultats en les dirigeant vers le sort
commande. Supposons que vous souhaitiez trier la liste des noms dans contacts.txt
. Examinons d'abord le contenu tel qu'il est dans le fichier avant de trier :
$ cat contacts.txt
Bob Jones
Leslie Smith
Dana David
Susan Gee
Leonard Schmidt
Linda Gray
Terry Jones
Colin Doe
Jenny Case
Maintenant, triez la liste :
$ cat contacts.txt | sort
Bob Jones
Colin Doe
Dana David
Jenny Case
Leonard Schmidt
Leslie Smith
Linda Gray
Susan Gee
Terry Jones
Vous pouvez inverser l'ordre de tri avec le -r
commutateur :
$ cat contacts.txt | sort -r
Terry Jones
Susan Gee
Linda Gray
Leslie Smith
Leonard Schmidt
Jenny Case
Dana David
Colin Doe
Bob Jones
Le résultat de l'un ou l'autre de ces éléments correspondait-il à ce que vous attendiez ? Par défaut, le sort
La commande effectue un tri du dictionnaire sur le premier mot ou la première colonne, c'est pourquoi Bob Jones
et Terry Jones
ne sont pas répertoriés les uns après les autres.
Vous pouvez trier par la deuxième colonne avec le -k
switch, en spécifiant la colonne sur laquelle vous voulez trier, qui dans notre liste est la colonne deux :
$ cat contacts.txt | sort -k2
Jenny Case
Dana David
Colin Doe
Susan Gee
Linda Gray
Bob Jones
Terry Jones
Leonard Schmidt
Leslie Smith
Si vous avez une longue liste de contacts et que vous pensez que cette liste contient des entrées en double, vous pouvez diriger votre liste vers sort
puis uniq
pour supprimer ces doublons :
$ cat contacts.txt | sort | uniq
Cette commande affiche uniquement les entrées uniques, mais elle n'enregistre pas les résultats. Pour trier le fichier, filtrer les entrées uniques, puis enregistrer le nouveau fichier, utilisez ceci :
$ cat contacts.txt | sort -k2 | uniq > contact_list.txt
N'oubliez pas que l'opérateur pipe et les opérateurs de redirection de fichier font des choses différentes.
Conclusion
Maintenant que vous avez goûté à la puissance de la ligne de commande, pensez-vous pouvoir en assumer la responsabilité ? Les utilitaires de ligne de commande ont plus de flexibilité que leurs homologues graphiques. Et pour certaines tâches, il n'y a pas d'équivalent graphique.
La meilleure façon d'apprendre le comportement de la ligne de commande est d'expérimenter. Par exemple, le sort
La commande n'a pas fait ce que vous pensiez qu'elle devrait faire jusqu'à ce que vous exploriez davantage. N'oubliez pas d'utiliser la puissance de votre manuel (man
) pour trouver ces commutateurs et options secrets "cachés" qui transforment la frustration de la ligne de commande en succès de la ligne de commande.