L'opérateur "pipe" en ligne de commande

culture générale informatique Sep 28, 2022

Hello,

Faire de la ligne de commande, ca fait jamais plaisir.

Apprendre à la dompter peut t’aider à être plus à l’aise

L'opérateur "pipe" est le truc le plus cheaté de la ligne de commande sous Linux.

C'est hyper puissant mais dur à comprendre et à utiliser, au début.

Voyons un peu ce que l’on peut faire.

La base

Déjà "pipe" (que je prononce à l'anglaise), c'est le bâton debout, le |

Il s’utilise entre deux commandes.

Ca permet d’utiliser la “sortie” de la 1ère commande comme “entrée” de la 2ème commande.

Simple, non ?

Premier exemple :

grep “toto” fichier.txt
# Affiche toutes les lignes de fichier.txt qui contiennent “toto” (c’est la sortie de la commande grep)

wc -l
# Attend en “entrée” du texte
# et en Affiche le nombre de ligne

grep “toto” fichier.txt | wc -l
# Affiche donc le nombre de lignes qui contiennent “toto” du fichier.txt

L’équivalent en Dev, c’est quand tu appelles une fonction avec comme paramètre l’appel à une autre fonction :

function add(a,b):    
    return a+b

function double(a):
    return 2 * a

double(add(1,2))
# Tout le monde a trouvé que le résultat est 6

Le return de “add” est passé comme argument à “double”

Ben le “pipe” c’est presque pareil pour la ligne de commande

Petit subtilité importante :

“pipe” passe à la prochaine commande ce que l’on appelle la “sortie standard”, c’est à dire ce qui aurait dû être affiché à l’écran.

Donc à l’inverse des return de fonctions, “pipe” ne manipule que des chaines de caractères (il n’y a pas d’autre typage possible)

Si on veut avoir les mots techniques : “pipe” connecte le STDOUT de la 1ere commande au STDIN de la 2ème commande.

Et bien sur, tu peux enchainer plusieurs “pipe”

cat fichier.txt | grep “toto” | sed -e “s/toto/tutu/” | wc -l

Des cas d’utilisation

J’utilise surtout “pipe” pour la manipulation des fichiers et de leurs contenus :

  • pour extraire des informations de gros fichiers CSV

  • pour mieux formater des logs d’applications et extraire que les messages qui m’intéressent

  • pour formater un CSV dans un autre CSV (en changeant et modifiant les données)

  • pour extraire des informations sur des fichiers

     

Généralement, quand tu utilises des fichiers temporaires pour stocker des résultats, c’est qu’il est fort probable qu’il te manque des “pipe”.

Tu peux remplacer les fichiers temporaires par l’enchainement des “pipe”.

Vu qu’on manipule des chaines de caractères et des lignes, les commandes souvent utilisés avec “pipe” sont : sed, grep, cat, awk, sort, wc, uniq…

 

# Liste tous les fichiers du dossier qui se terminent par txt

ls -l | grep "\.txt$"

# Donne le nombre tous les fichiers du dossier qui se terminent par txt

ls -l | grep "\.txt$" | wc -l 

# Récupère toutes les lignes qui contiennent toto de fichier.txt
# Transforme les "toto" en "tutu"
# Ecrit toutes les lignes transformées dans resultat.txt

cat fichier.txt | grep “toto” | sed -e “s/toto/tutu/” > 
resultat.txt


# la même chose mais en plus court et sans pipe

sed  -e '/toto/!d' -e 's/toto/tutu/' fichier.txt > resultat.txt


# Ranger les fichiers par ordre alphabétique
ls | sort

 

Un autre exemple avec GIT

# Compte le nombre de lignes attribuées à chaque auteur

git blame --line-porcelain file |

sed -n 's/^author //p' |

sort | uniq -c | sort -rn

 

Pour aller plus loin

 
  • Attention, “pipe” est asynchrone et fonctionne “ligne par linge”

    • il n’attend pas que la 1ère commande soit finie pour passer les infos à la 2nd

    • Et dès que une ligne est créée, il l’a passe

    • Dans ce cas, comment “wc -l” fonctionne dans le 1er exemple me diras-tu

      • C’est à “wc” de gérer la lecture au fur et à mesure sur son entrée et de détecter quand s’arrêter

  • Petit exo : Sauras-tu me dire ce que fait cette ligne de commande ?

    • C’est une vraie ligne de commande que j’ai utilisé il y a quelques jours

cat error.log | grep message | sed -e "s/  message: \"\"'//" | sed -e "s/  message: \`\"\"//" | sed -e "s/'\"\"$//" -e "s/\"\"\`$//" | grep -v "Script at product" | grep -v "Load products from" | sort > todo.txt 

Conclusion 

Tu as maintenant les bases. Pour continuer, il te suffit de l’utiliser le plus souvent possible.

A vendredi prochain

Imrane 🏖

La newsletter pour ne rien louper

Rejoins les 2500 lecteurs de  la newsletter pour obtenir des conseils, des stratégies et des ressources pour développer et monétiser tes compétences Tech.