Comment utiliser les tuyaux sous Linux

Utilisez des canaux Linux pour chorégraphier la manière dont les utilitaires de ligne de commande collaborent. Simplifiez les processus complexes et augmentez votre productivité en exploitant un ensemble de commandes autonomes et en les transformant en une équipe unique. Nous vous montrons comment.

Les tuyaux sont partout

Les tubes sont l’une des fonctionnalités de ligne de commande les plus utiles des systèmes d’exploitation de type Linux et Unix. Les tuyaux sont utilisés d’innombrables façons. Regardez n’importe quel article de ligne de commande Linux – sur n’importe quel site Web, pas seulement sur le nôtre – et vous verrez que les tuyaux font leur apparition le plus souvent. J’ai passé en revue certains des articles Linux de toptips.fr, et les tuyaux sont utilisés dans chacun d’eux, d’une manière ou d’une autre.

Les canaux Linux vous permettent d’effectuer des actions qui ne sont pas prises en charge par le coquille. Mais parce que la philosophie de conception Linux est d’avoir de nombreux petits utilitaires qui exécutent leur fonction dédiée très bien, et sans fonctionnalités inutiles – le mantra «faites une chose et faites-le bien» – vous pouvez raccorder des chaînes de commandes avec des tuyaux pour que la sortie d’une commande devienne l’entrée d’une autre. Chaque commande que vous exécutez apporte son talent unique à l’équipe et vous découvrez bientôt que vous avez réuni une équipe gagnante.

Un exemple simple

Supposons que nous ayons un répertoire rempli de nombreux types de fichiers différents. Nous voulons savoir combien de fichiers d’un certain type se trouvent dans ce répertoire. Il existe d’autres façons de faire cela, mais le but de cet exercice est d’introduire des tuyaux, donc nous allons le faire avec des tuyaux.

Nous pouvons facilement obtenir une liste des fichiers en utilisant ls:

ls

Collection si fichiers dans un répertoire, dans une fenêtre de terminal

Pour séparer le type de fichier d’intérêt, nous utiliserons grep. Nous voulons trouver les fichiers qui ont le mot «page» dans leur nom de fichier ou leur extension de fichier.

Nous utiliserons le caractère spécial du shell «|» pour diriger la sortie de ls vers grep.

ls | grep "page"

ls -l | grep

grep imprime des lignes qui correspond à son modèle de recherche. Cela nous donne donc une liste contenant uniquement des fichiers «.page».

liste des fichiers de page dans une fenêtre de terminal

Même cet exemple trivial affiche la fonctionnalité des tuyaux. La sortie de ls n’a pas été envoyée à la fenêtre du terminal. Il a été envoyé à grep en tant que données pour que la commande grep puisse fonctionner. La sortie que nous voyons provient de grep, qui est la dernière commande de cette chaîne.

Extension de notre chaîne

Commençons par étendre notre chaîne de commandes piped. nous pouvons compter les fichiers «.page» en ajoutant la commande wc. Nous utiliserons l’option -l (nombre de lignes) avec wc. Notez que nous avons également ajouté l’option -l (format long) à ls. Nous allons l’utiliser sous peu.

ls - | grep "page" | wc -l

ls - | grep

grep n’est plus la dernière commande de la chaîne, nous ne voyons donc pas sa sortie. La sortie de grep est introduite dans la commande wc. La sortie que nous voyons dans la fenêtre du terminal provient de wc. wc signale qu’il y a 69 fichiers «.page» dans le répertoire.

  Comment insérer des puces dans une feuille de calcul Excel

Prolongons encore les choses. Nous retirerons la commande wc de la ligne de commande et la remplacerons par awk. Il y a neuf colonnes dans la sortie de ls avec l’option -l (format long). Nous utiliserons awk pour imprimer des colonnes cinq, trois et neuf. Ce sont la taille, le propriétaire et le nom du fichier.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'

ls -l | grep

Nous obtenons une liste de ces colonnes, pour chacun des fichiers correspondants.

Liste de trois colonnes pour chaque fichier correspondant dans une fenêtre de terminal

Nous allons maintenant passer cette sortie via la commande sort. Nous utiliserons l’option -n (numérique) pour indiquer au tri que la première colonne doit être traités comme des nombres.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n

ls -l | grep

La sortie est maintenant triée par ordre de taille de fichier, avec notre sélection personnalisée de trois colonnes.

Fichiers triés par taille dans une fenêtre de terminal

Ajouter une autre commande

Nous terminerons en ajoutant la commande tail. Nous lui dirons de lister les cinq dernières lignes de sortie seulement.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5

ls -l | grep

Cela signifie que notre commande se traduit par quelque chose comme « montre-moi les cinq plus gros fichiers » .page « de ce répertoire, classés par taille. » Bien sûr, il n’y a pas de commande pour accomplir cela, mais en utilisant des tuyaux, nous avons créé le nôtre. Nous pourrions ajouter ceci – ou toute autre commande longue – en tant qu’alias ou fonction shell pour enregistrer tout le typage.

Voici la sortie:

Cinq plus gros fichiers .page classés par ordre de taille dans une fenêtre de terminal

Nous pourrions inverser l’ordre des tailles en ajoutant l’option -r (reverse) à la commande sort, et en utilisant head au lieu de tail pour choisir les lignes du haut de la sortie.

ls -l |  grep 

Cette fois, les cinq plus gros fichiers « .page » sont répertoriés du plus grand au plus petit:

Cinq plus gros fichiers .page répertoriés dans l'ordre de taille inverse dans une fenêtre de terminal

Quelques exemples récents

Voici deux exemples intéressants tirés d’articles récents de toptips.fr.

Certaines commandes, telles que la commande xargscommand, sont conçues se faire envoyer une entrée. Voici un moyen pour que les wc comptent le mots, caractères et lignes dans plusieurs fichiers, en envoyant ls dans xargs qui alimente ensuite la liste des noms de fichiers vers wc comme s’ils avaient été passés à wc en tant que paramètres de ligne de commande.

ls *.page | xargs wc

ls * .page | xargs wc dans une fenêtre de terminal

Le nombre total de mots, de caractères et de lignes est répertorié en bas de la fenêtre du terminal.

  Comment jouer à Dead Rising 2 sur Linux

Nombre de mots, caractères et lignes dans une fenêtre de terminal

Voici un moyen d’obtenir une liste triée des extensions de fichier uniques dans le répertoire actuel, avec un décompte de chaque type.

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c

ls | rev | couper -d '.' -f1 | rev | trier | uniq -c dans une fenêtre de terminal

Il se passe beaucoup de choses ici.

ls: répertorie les fichiers du répertoire
tour: Inverse le texte dans les noms de fichiers.
Couper: Coupe la chaîne à la première occurrence du délimiteur spécifié «.». Le texte après cela est supprimé.
rev: inverse le texte restant, qui est l’extension du nom de fichier.
sort: trie la liste par ordre alphabétique.
uniq: compte le nombre de chaque entrée unique dans la liste.

La sortie affiche la liste des extensions de fichiers, triées par ordre alphabétique avec un nombre de chaque type unique.

Liste des extensions de fichiers uniques dans une fenêtre de terminal

Tuyaux nommés

Il existe un autre type de tube à notre disposition, appelé tubes nommés. Les tubes des exemples précédents sont créés à la volée par le shell lorsqu’il traite la ligne de commande. Les tuyaux sont créés, utilisés, puis supprimés. Ils sont transitoires et ne laissent aucune trace d’eux-mêmes. Ils n’existent que tant que la commande qui les utilise est en cours d’exécution.

Les canaux nommés apparaissent comme des objets persistants dans le système de fichiers, vous pouvez donc les voir à l’aide de ls. Ils sont persistants car ils survivront au redémarrage de l’ordinateur, bien que toutes les données non lues qu’ils contiennent à ce moment-là seront supprimées.

Les canaux nommés étaient souvent utilisés à la fois pour permettre à différents processus d’envoyer et de recevoir des données, mais je ne les ai pas vus utilisés de cette façon depuis longtemps. Il y a sans doute des gens qui les utilisent encore à bon escient, mais je n’en ai pas rencontré récemment. Mais par souci d’exhaustivité, ou simplement pour satisfaire votre curiosité, voici comment vous pouvez les utiliser.

Les canaux nommés sont créés avec la commande mkfifo. Cette commande créera un tube nommé appelé «geek-pipe» dans le répertoire courant.

mkfifo geek-pipe

mkfifo geek-pipe dans une fenêtre de terminal

Nous pouvons voir les détails du tube nommé si nous utilisons la commande ls avec l’option -l (format long):

ls -l geek-pipe

ls -l geek-pipe dans une fenêtre de terminal

Le premier caractère de la liste est un «p», ce qui signifie que c’est un tuyau. Si c’était un «d», cela signifierait que l’objet du système de fichiers est un répertoire, et un tiret «-» signifierait qu’il s’agit d’un fichier normal.

Utilisation du tuyau nommé

Utilisons notre pipe. Les tubes sans nom que nous avons utilisés dans nos exemples précédents transmettaient immédiatement les données de la commande d’envoi à la commande de réception. Les données envoyées via un canal nommé resteront dans le canal jusqu’à ce qu’elles soient lues. Les données sont en fait conservées en mémoire, donc la taille du tube nommé ne variera pas dans les listes ls, qu’il y ait des données ou non.

  Comment désactiver les gestes du pavé tactile pour le lecteur VLC sous Windows 10

Nous allons utiliser deux fenêtres de terminal pour cet exemple. J’utiliserai l’étiquette:

# Terminal-1

dans une fenêtre de terminal et

# Terminal-2

dans l’autre, afin que vous puissiez les différencier. Le hachage «#» indique au shell que ce qui suit est un commentaire, et de l’ignorer.

Prenons l’intégralité de notre exemple précédent et redirigeons cela dans le tube nommé. Nous utilisons donc à la fois des tubes non nommés et nommés dans une seule commande:

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe

ls | rev | couper -d '.' -f1 | rev | trier | uniq -c> geek-pipe dans une fenêtre de terminal ”width =” 646 ″ height = ”97 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Il ne se passera rien de grand-chose. Vous remarquerez peut-être que vous ne revenez pas à l’invite de commande, donc quelque chose se passe. </p><p> Dans l’autre fenêtre de terminal, exécutez cette commande: </p><pre> cat <geek- pipe </pre><p> <img loading =

Nous redirigeons le contenu du tube nommé vers cat, afin que cat affiche ce contenu dans la deuxième fenêtre de terminal. Voici le résultat:

Le contenu du tube nommé affiché dans une fenêtre de terminal

Et vous verrez que vous êtes revenu à l'invite de commande dans la première fenêtre de terminal.

Tâche terminée et l'invite de commande dans une fenêtre de terminal

Alors, ce qui vient de se passer.

Nous avons redirigé une partie de la sortie dans le tube nommé.
La première fenêtre de terminal n'est pas revenue à l'invite de commande.
Les données sont restées dans le tuyau jusqu'à ce qu'elles soient lues à partir du tuyau du deuxième terminal.
Nous avons été renvoyés à l'invite de commande dans la première fenêtre de terminal.

Vous pensez peut-être que vous pourriez exécuter la commande dans la première fenêtre de terminal en tant que tâche d'arrière-plan en ajoutant un & à la fin de la commande. Et vous auriez raison. Dans ce cas, nous aurions été renvoyés à l'invite de commande immédiatement.

Le but de ne pas utiliser le traitement en arrière-plan était de souligner qu'un canal nommé est un processus de blocage. Mettre quelque chose dans un tube nommé n'ouvre qu'une seule extrémité du tube. L'autre extrémité n'est pas ouverte tant que le programme de lecture n'a pas extrait les données. Le noyau suspend le processus dans la première fenêtre de terminal jusqu'à ce que les données soient lues depuis l'autre extrémité du tube.

La puissance des tuyaux

De nos jours, les pipes nommées sont en quelque sorte un acte de nouveauté.

Les anciens tuyaux Linux, en revanche, sont l'un des outils les plus utiles que vous puissiez avoir dans votre boîte à outils de fenêtre de terminal. La ligne de commande Linux commence à prendre vie pour vous, et vous obtenez une toute nouvelle mise sous tension lorsque vous pouvez orchestrer une collection de commandes pour produire une performance cohérente.

Conseil de séparation: il est préférable d'écrire vos commandes pipées en ajoutant une commande à la fois et en faisant fonctionner cette partie, puis en ajoutant la commande suivante.