Comment canaliser et rediriger comme un pro dans la ligne de commande Linux
Sommaire
Points clés à retenir
-
Les commandes Linux peuvent utiliser des flux standard pour les messages d'entrée, de sortie et d'erreur.
-
La redirection envoie un flux de sortie vers un fichier au lieu de la fenêtre du terminal.
-
Le piping vous permet d'enchaîner des commandes, de sorte que la sortie de l'une devienne l'entrée d'une autre.
Sous Linux, les canaux et la redirection vous permettent d'utiliser le résultat des commandes de manière puissante. Capturez-le dans des fichiers ou utilisez-le comme entrée avec d'autres commandes. Voici ce que vous devez savoir.
Que sont les flux ?
Linux, comme d'autres systèmes d'exploitation de type Unix, a un concept de flux. Chaque processus possède un flux d'entrée appelé stdin, un flux de sortie appelé stdout et un flux d'erreurs appelé stderr. Les flux Linux, comme les flux du monde réel, ont deux points finaux. Ils ont une source ou entrée et une destination ou sortie.
Le flux d'entrée peut provenir du clavier vers la commande, vous permettant d'envoyer du texte tel que des informations ou des commandes au processus. Le flux de sortie provient de la commande, généralement vers la fenêtre du terminal. Le flux stderr écrit également dans la fenêtre du terminal.
Vous pouvez rediriger les flux et les rediriger. Redirection signifie envoyer la sortie ailleurs que dans la fenêtre du terminal. Tuyauterie signifie prendre la sortie d’une commande et l’utiliser comme entrée d’une autre commande.
Cela vous permet d'enchaîner des commandes pour créer des solutions sophistiquées à partir d'une série de commandes simples travaillant en collaboration.
Redirection des flux
La forme de redirection la plus simple prend le résultat d’une commande et l’envoie vers un fichier. Même ce cas trivial peut être utile. Peut-être avez-vous besoin d'un enregistrement du résultat de la commande, ou peut-être qu'il y a tellement de résultats qui défilent que vous ne pouvez pas les lire.
Sur ce PC de test, la commande du génère 1380 lignes de texte. Nous l'enverrons dans un fichier.
du > disk-usage.txt
Le crochet droit indique au shell de rediriger la sortie stdout de la commande du vers un fichier appelé disk-usage.txt. Aucune sortie n’est envoyée à la fenêtre du terminal.
Nous pouvons utiliser ls pour vérifier que le fichier a été créé et wc pour compter les lignes, les mots et les lettres du fichier. Comme prévu, wc signale que le fichier contient 1 380 lignes.
ls
wc disk-usage.txt
Ce type de redirection crée ou écrase le fichier à chaque fois que vous l'utilisez. Si vous souhaitez ajouter le texte redirigé à la fin d'un fichier existant, utilisez des doubles crochets droits « >> », comme ceci.
ls /home/dave-mckay/ -R >> disk-usage.txt
wc disk-usage.txt
En utilisant l'option -N (numéros de ligne) avec moins, nous pouvons vérifier que les nouvelles informations ont été ajoutées après la ligne 1380.
Si nous écrivons une commande qui génère une erreur, nous verrons que, comme nous redirigeons uniquement la sortie standard, tous les messages d'erreur stderr sont toujours envoyés à la fenêtre du terminal.
wc disk-usage.txt missing-file.txt > results.txt
wc: missing-file.txt: No such file or directory
cat results.txt
Les résultats pour disk-usage.txt sont envoyés au fichier results.txt, mais le message d'erreur pour le fichier.txt manquant inexistant est envoyé à la fenêtre du terminal.
Nous pouvons ajouter des indicateurs numériques au crochet droit pour indiquer explicitement le flux que nous redirigeons. Le flux 1 est stdout et le flux 2 est stderr. Nous pouvons rediriger stdout vers un fichier et stderr vers un autre, assez facilement.
wc disk-usage.txt missing-file.txt 1> results.txt 2> error.txt
cat results.txt
cat error.txt
Si vous souhaitez que les deux flux soient redirigés vers un seul fichier, nous redirigeons la sortie standard vers un fichier et demandons au shell de rediriger stderr vers la même destination que celle vers laquelle stdout va.
wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt
Tous les messages d'erreur sont capturés et envoyés vers le même fichier que la sortie standard.
Vous ne souhaiterez peut-être pas du tout stocker la sortie, vous ne voulez tout simplement pas que quoi que ce soit soit écrit dans la fenêtre du terminal. Le fichier de périphérique nul, qui consomme silencieusement tout ce qui lui est envoyé, est une destination pratique pour envoyer des sorties d'écran indésirables.
rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1
Ni les messages stdout ni stderr ne sont écrits dans la fenêtre du terminal, même si l'un des fichiers que nous supprimons n'existe pas.
Une dernière astuce que vous pouvez faire avec la redirection consiste à lire un fichier dans le flux stdin d'une commande.
wc < /etc/passwd
Vous pouvez combiner cela avec la redirection de la sortie.
wc < /etc/passwd > results.txt
cat results.txt
Faire passer les flux dans des tuyaux
Un tube redirige efficacement la sortie standard d'une commande et l'envoie au stdin d'une autre commande. Le piping est l'un des aspects les plus puissants de la ligne de commande et peut transformer votre utilisation des commandes et utilitaires Linux de base.
Pour rediriger la sortie d'une commande vers une autre, nous utilisons le tube « | » symbole. Par exemple, si nous voulions lister de manière récursive tous les fichiers et sous-répertoires de votre répertoire personnel, vous verriez un flou rapide lorsque la sortie de ls défilera dans la fenêtre du terminal.
En redirigeant la commande ls vers less, nous obtenons les résultats affichés dans une visionneuse de fichiers pratique.
ls -R ~ | less
C'est plus efficace que le processus manuel en deux étapes consistant à envoyer la sortie dans un fichier et à ouvrir le fichier en moins de temps.
Sortie de canalisation via une autre commande
Le piping prend tout son sens lorsque la deuxième commande effectue un traitement ultérieur sur la sortie de la première commande.
Comptons le nombre de comptes utilisateurs et pseudo-utilisateurs sur votre ordinateur. Nous utiliserons cat pour vider le contenu du fichier /etc/passwd et le rediriger vers wc. L'option -l (lignes) comptera le nombre de lignes dans ce fichier. Comme il y a une ligne par compte, il compte les comptes pour nous.
cat /etc/passwd | wc -l
Cela semble beaucoup. Voyons les noms de ces comptes. Cette fois, nous allons diriger le chat vers awk. La commande awk doit utiliser les deux points « : » comme séparateur de champ et imprimer le premier champ.
cat /etc/passwd | awk -F: '{print $1}'
Nous pouvons continuer à ajouter des commandes. Pour trier la liste, ajoutez la commande sort afin que la sortie de awk soit dirigée vers la commande sort.
cat /etc/passwd | awk -F: '{print $1}' | sort
Acheminement de la sortie via une chaîne de commandes
Voici un ensemble de quatre commandes reliées par trois tuyaux. la commande ps répertorie les processus en cours d'exécution. L'option -e (tout) répertorie tous les processus et l'option -o (sortie) spécifie les informations à rapporter. Le jeton de communication signifie que nous voulons voir uniquement le nom du processus.
La liste des noms de processus est ensuite transmise à grep, qui filtre les processus dont le nom contient du chrome. Cette liste filtrée est introduite dans le tri, pour trier la liste. La liste triée est ensuite redirigée vers uniq. L'option -c (count) compte les noms de processus uniques. Ensuite, juste pour s'amuser, on fait la même chose pour Firefox.
ps -e -o comm | grep chrome | sort | uniq -c
ps -e -o comm | grep firefox | sort | uniq -c
Combinaisons infinies
Il n'y a pas de limite au nombre de commandes que vous pouvez regrouper, sachez simplement que chaque commande est ouverte dans son propre nouveau sous-shell. Cela ne devrait pas poser de problème, même sur les ordinateurs modernes les plus modestes, mais si vous constatez des ralentissements, envisagez de simplifier vos commandes. Ou soyez patient.