Bash linux 6 : Les pipes et les redirections

in #utopian-io8 years ago

Les pipes et les redirections

Introduction

This article is about mechanisms of piping and redirecting data, these mechanisms enable us to manipulate data in a smart way wish spare us unnecessary efforts.

>

Les pipes et les redirections , qu'est ce que c'est?

Chaque programme qu'on exécute sur une ligne de commande a automatiquement trois flux qui lui sont connectés.

  • STDIN (0) -entrée standard
  • STDOUT (2} -sortie standard
  • STDERR (2) - erreur standard pour afficher les messages d'erreur ainsi que les messages de diagnostique

Les pipes et les redirections sont les moyens par lesquels on peut connecter les programmes et les fichiers pour diriger les informations d'une manière intéressante.

Redirection du résultat d'une commande vers un fichier

Le résultat de l'exécution d'une commande s'affiche normalement dans la console, parfois on peut vouloir sauvegarder ce résultat dans un fichier. L'opérateur utilisé pour cette fin est ( > )(chevron) qui indique à la ligne de commande qu'on veut sauvegarder le résultat de la commande dans un fichier au lieu de l'afficher dans la console. Voici un exemple qui illustre ce qu'on vient d'expliquer.

user@bash: ls
apercu.jpg bernard bilan.txt  cours.txt exams.txt svdesortie
tp.txt
user@bash: ls > svdesortie
user@bash: ls
cours.txt bernard exams.txt svdesortie  tp.txt apercu.jpg bilan.txt 
user@bash: cat svdesortie
apercu.jpg
bernard
bilan.txt 
cours.txt
exams.txt
svdesortie
tp.txt
user@bash:

  • La ligne 1 on a commencé par consulter ce qui se trouve dans notre répertoire.
  • La ligne 2 on va exécuter la meme commande mais cette fois-ci on va utiliser l'opérateur > pour indiquer au terminal qu'on veut sauvegarder la sortie de la commande dans un fichier. Vous allez remarquer qu'on n' a pas besoin de créer un fichier avant de l'utiliser pour la sauvegarde, celui-ci se crée automatiquement s'il n'existe pas.
  • La ligne 4 notre fichier a été créé.
  • La ligne 6 on consulte le contenu du fichier en question.

Quelques remarques

Quand on a recours aux pipes et à la redirection, les informations restent intactes, par contre le formatage peut légèrement changer par rapport à ce qui est normalement écrit sur l'écran.

Vous allez remarquer que le fichier créé pour la sauvegarde fait partie de la liste. On crée premièrement le fichier(s'il n'existe pas) , on exécute le programme puis on sauvegarde le résultat dans le fichier.

La sauvegarde dans un fichier existant

Si on redirige le résultat d'une commande dans un fichier qui n'existe pas, celui-ci va être automatiquement créé, mais s'il s'agit d'un fichier existant, l'ancien contenu va être écraser et le contenu sera la sortie de la commande.

user@bash: cat svdesortie
apercu.jpg
bernard
bilan.txt 
cours.txt
exams.txt
svdesortie
tp.txt
user@bash: wc -l exams.txt > svdesortie
user@bash:
6 exams.txt
user@bash:


On peut aussi ajouter le résultat qu'on veut sauvegarder à l'ancien contenu du fichier sans devoir l'écraser. Pour ce faire, ou utilise l'opérateur (>>).

user@bash: cat svdesortie
6 exams.txt
user@bash: ls >> svdesortie
user@bash: cat svdesortie
apercu.jpg
bernard
bilan.txt 
cours.txt
6 exams.txt
exams.txt
svdesortie
tp.txt
user@bash:

Redirection depuis un fichier

L'opérateur (<) sert de redirection d'informations dans le sens contraire. On va lire les informations depuis le fichier et on va l'alimenter au programme à travers le flux STDIN.

use@bash: wc -l svdesortie
8 svdesortie
user@bash: wc -l < svdesortie
8
user@bash:

Beaucoup de programmes nous permettent de fournir un fichier comme argument de ligne de commande, son contenu sera lu et traité. L'exemple ci-dessus illustre une différence subtile mais utile. Vous allez remarqué que quand on exécute wc en fournissant un fichier comme argument de ligne de commande, la sortie du programme inclut le nom du fichier qui a été traité. Quand on a exécuté le contenu du ficher qu'on a fournit au programme pour l'exécuter, les informations sont envoyées anonymement, la commande wc a reçu un contenu à traiter dont elle ignore la provenance. Ce mécanisme est souvent utilisé pour éviter d'afficher des informations complémentaires .

On peut facilement combiner les deux formes de redirections qu'on a vu jusqu'à présent dans une seule commande comme suivant.

user@bash: wc -l < exams.txt >
user@bash: cat svdesortie
6
user@bash:

Redirection STDERR

On a associé aux trois flux des numéros. on a attribué à STDERR le numéro 2, on pourra utiliser ces numéros pour identifier les flux. Si on place le numéro 2 avant l'opérateur > le flux STDERR va être rediriger (si on utilise aucun numéro et c'est ce qu'on a fait jusqu'à présent, il s'agit par défaut de la redirection STDOUT ).

user@bash: ls -l bilan.txt sfile.nt
ls: cannot access sfile.nt: No such file or directory
-r-xr--x-- 1 nick users 5 Feb 15 05:14 bilan.txt
user@bash: ls -l bilan.txt sfile.nt 2> errors.txt
-r-xr--x-- 1 nick users 5 Feb 15 05:14 bilan.txt
user@bash: cat errors.txt
ls: cannot access sfile.nt: No such file or directory
user@bash:

Peut être on a besoin de sauvegarder la sortie standard et les messages d'erreur dans un seul fichier. Cela peut être fait par la redirection du flux STDERR vers le flux STDOUT et par la redirection de STDOUT vers un fichier. On redirige d'abord vers un fichier puis on redirige le flux d'erreur. On identifie la redirection vers un flux en plaçant un & devant le nombre de flux ( Sinon la redirection se fera vers un fichier appelé 1).

user@bash: ls -l bilan.txt sfile.nt > svdesortie 2>&1
user@bash: cat svdesortie
ls: cannot access sfile.nt: No such file or directory
-r-xr--x-- 1 nick users 5 Feb 15 05:14 bilan.txt
user@bash:

Ls pipes

Jusqu'à présent, on a parlé du transfert d'informations d'un fichier et vers un fichier. Maintenant on va s'intéresser à un autre mécanisme (le Piping), l'opérateur utilisé pour cela est ( | ). cet opérateur alimente la sortie standard à travers le programme(à gauche comme entrée) au programme à droite. Dans l'exemple ci-dessus, on va lister uniquement les 3 première fichiers dans le répertoire.

user@bash: ls
cours.txt bernard exams.txt svdesortie  tp.txt apercu.jpg 
user@bash: ls  | head -3
cours.txt
bernard
exams.txt
user@bash:

On peut acheminer beaucoup de programmes ensemble. Dans l'exemple ci-dessous on a acheminé la sortie à tail dans le but d'avoir uniquement le 3 ème fichier.

user@bash: ls  | head -3  | tail -1
exams.txt
user@bash:

On peut aussi combiner les pipes et les redirections.

user@bash: ls  | head -3  | tail -1 > svdesortie
user@bash: cat svdesortie
exams.txt
user@bash:

D'autres exemples

On va recourir dans ces exemples à des arguments de ligne de commande qu'on n' a pas abordé dans les parties précédentes, il est conseillé de consulter les pages de manuel pour découvrir leurs fonctionnalités.

Dans cet exemple, on affiche la liste triée d'un répertoire avec la commande sort de telle façon que les répertoires s'affichent en premier.

user@bash: ls-l /amg  | tail -n +2  | sort
d-w-rwxr-x 3 mani these 1200 May 15 09:23 mani
dr-xr-x--- 2 thai expose 1200 Feb 13 01:17 expose
drw-r-x--- 2 rib compte 1200 Jan 7 12:08 compte
...
user@bash:

Dans cet exemple, on va alimenter la sortie d'un programme dans un sous-programme pour l'afficher clairement.

user@bash: ls -l /amg | less
(Full screen of output you may scroll. Try it yourself to see.)

Identifier tous les fichiers dans votre répertoire home pour lesquels le groupe à une permission d'écrire.

user@bash: ls -l ~ | grep '^.....w'
d-w-rwxr-x 3 mani these 1200 May 15 09:23 mani
user@bash:

Créer une liste de chaque utilisateur à qui appartient un fichier dans un répertoire ainsi que combien de fichiers et de répertoires il a.

user@bash: ls -l /theses/parties | tail -n +2 |sed
's/\s\s*/ /g' | cut -d ' ' -f 3 | sort | uniq -c
10 eric
12 emilie
11 catia
14 bryan
user@bash:



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @raptorjesus I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x

Coin Marketplace

STEEM 0.13
TRX 0.33
JST 0.034
BTC 110797.76
ETH 4320.82
USDT 1.00
SBD 0.83