Aller au contenu principal

Redirections et pipes


Table des matières

  1. stdin, stdout, stderr
  2. Redirections (>, >>, <, 2>)
  3. Pipes : |
  4. tee et xargs
  5. Combinaisons avancées
  6. Exercices pratiques


1 - stdin, stdout, stderr

Les trois flux standards

Chaque processus Linux a trois flux de données :

FluxDescripteurUsage
stdin0Entrée standard (clavier)
stdout1Sortie standard (résultats)
stderr2Erreurs standard (messages d'erreur)

Exemple

# Cette commande utilise les 3 flux
ls /home /inexistant

# stdout : liste de /home (succès)
# stderr : message d'erreur pour /inexistant

Pourquoi séparer stdout et stderr ?

Cela permet de :

  • Rediriger les résultats vers un fichier
  • Garder les erreurs à l'écran
  • Ou l'inverse
  • Ou rediriger les deux séparément

🔝 Retour à la table des matières



2 - Redirections : >, >>, <, 2>

Rediriger stdout

# Écrire dans un fichier (écrase)
echo "Hello" > fichier.txt

# Ajouter à un fichier (append)
echo "World" >> fichier.txt

# Résultat dans fichier.txt :
# Hello
# World

# Lister vers un fichier
ls -la > liste.txt

Rediriger stderr

# Rediriger les erreurs
ls /inexistant 2> erreurs.txt

# Rediriger erreurs et ajouter
commande 2>> erreurs.log

Rediriger stdout ET stderr

# Méthode 1 : Séparément
commande > output.txt 2> errors.txt

# Méthode 2 : Tout dans le même fichier
commande > all.txt 2>&1

# Méthode 3 : Syntaxe moderne (bash 4+)
commande &> all.txt

# Méthode 4 : Ajouter les deux
commande >> all.txt 2>&1

Rediriger stdin

# Lire depuis un fichier
wc -l < fichier.txt

# Équivalent (mais moins élégant)
cat fichier.txt | wc -l

/dev/null - Le trou noir

/dev/null absorbe tout ce qu'on lui envoie.

# Ignorer la sortie
commande > /dev/null

# Ignorer les erreurs
commande 2> /dev/null

# Ignorer tout
commande > /dev/null 2>&1
# ou
commande &> /dev/null

Tableau récapitulatif

SyntaxeEffet
>Rediriger stdout (écrase)
>>Rediriger stdout (ajoute)
2>Rediriger stderr (écrase)
2>>Rediriger stderr (ajoute)
&>Rediriger stdout + stderr
<Rediriger stdin
2>&1Envoyer stderr vers stdout

🔝 Retour à la table des matières



3 - Pipes : |

Concept

Le pipe | connecte la sortie d'une commande à l'entrée de la suivante.

Exemples basiques

# Compter les fichiers
ls | wc -l

# Filtrer une liste
cat /etc/passwd | grep root

# Trier et filtrer
ls -la | sort -k5 -n | head -10

Chaîner plusieurs commandes

# Pipeline complexe
cat access.log | grep "404" | cut -d' ' -f1 | sort | uniq -c | sort -rn | head -10

Décomposition :

  1. cat access.log : Lire le fichier
  2. grep "404" : Filtrer les erreurs 404
  3. cut -d' ' -f1 : Extraire le premier champ (IP)
  4. sort : Trier
  5. uniq -c : Compter les occurrences uniques
  6. sort -rn : Trier par nombre décroissant
  7. head -10 : Garder les 10 premiers

Exemples pratiques

# Top 5 processus par mémoire
ps aux | sort -k4 -rn | head -5

# Utilisateurs connectés uniques
who | cut -d' ' -f1 | sort -u

# Fichiers les plus gros
du -sh * | sort -rh | head -10

# Compter les lignes contenant "error"
grep -i error /var/log/syslog | wc -l

# IPs uniques dans un log
cat access.log | awk '{print $1}' | sort -u
astuce

Les pipes ne transmettent que stdout. Les erreurs (stderr) ne passent pas dans le pipe par défaut.

🔝 Retour à la table des matières



4 - tee et xargs

tee - Diviser la sortie

tee envoie la sortie vers un fichier ET l'affiche à l'écran.

# Voir ET sauvegarder
ls -la | tee liste.txt

# Ajouter au fichier
ls -la | tee -a liste.txt

# Écrire dans plusieurs fichiers
ls | tee fichier1.txt fichier2.txt fichier3.txt

# Pipeline avec tee intermédiaire
cat log.txt | grep error | tee errors.txt | wc -l

xargs - Construire des commandes

xargs transforme stdin en arguments pour une commande.

# Supprimer des fichiers listés
find . -name "*.tmp" | xargs rm

# Avec confirmation
find . -name "*.tmp" | xargs -p rm

# Un par un
find . -name "*.tmp" | xargs -I {} rm -v {}

# Limiter le nombre d'arguments
echo "a b c d e" | xargs -n 2 echo
# a b
# c d
# e

Exemples pratiques avec xargs

# Compresser plusieurs fichiers
find . -name "*.log" | xargs gzip

# Chercher dans plusieurs fichiers
find . -name "*.py" | xargs grep "import"

# Copier avec structure
find . -name "*.jpg" | xargs -I {} cp {} /backup/

# Exécuter en parallèle
cat urls.txt | xargs -P 4 -I {} curl -O {}

Options utiles de xargs

OptionEffet
-I {}Placeholder pour l'argument
-n NN arguments par commande
-P NN commandes en parallèle
-pDemander confirmation
-0Séparateur null (avec find -print0)

🔝 Retour à la table des matières



5 - Combinaisons avancées

Process substitution

# Comparer deux sorties de commande
diff <(ls dir1) <(ls dir2)

# Utiliser la sortie comme fichier
grep -f <(echo -e "pattern1\npattern2") fichier.txt

Here documents

# Entrée multiligne
cat << EOF
Ligne 1
Ligne 2
Ligne 3
EOF

# Avec variable
cat << EOF > config.txt
DATABASE_URL=$DATABASE_URL
APP_NAME=MonApp
EOF

Here strings

# Entrée d'une ligne
grep "pattern" <<< "texte à chercher"

# Avec variable
wc -w <<< "$MESSAGE"

Commandes en sous-shell

# Exécuter dans un sous-shell
(cd /tmp && ls)
# Le répertoire courant n'a pas changé

# Capturer la sortie
FILES=$(ls *.txt)
echo "Fichiers trouvés : $FILES"

Exemples de scripts one-liner

# Backup avec date
tar czf backup-$(date +%Y%m%d).tar.gz /data

# Trouver et supprimer les fichiers vides
find . -type f -empty -delete

# Remplacer dans plusieurs fichiers
grep -rl "ancien" . | xargs sed -i 's/ancien/nouveau/g'

# Surveillance de log en temps réel avec filtre
tail -f /var/log/syslog | grep --line-buffered "error"

# Top 10 des commandes les plus utilisées
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10

🔝 Retour à la table des matières



6 - Exercices pratiques

Exercice 1 : Redirections

# 1. Créez un fichier avec la liste de /etc
ls /etc > etc_list.txt

# 2. Ajoutez la liste de /var
ls /var >> etc_list.txt

# 3. Essayez de lister un dossier inexistant, redirigez l'erreur
ls /inexistant 2> erreur.txt

# 4. Vérifiez le contenu
cat erreur.txt

Exercice 2 : Pipes

# 1. Comptez les fichiers dans /etc
ls /etc | wc -l

# 2. Trouvez les 5 plus gros fichiers de votre home
du -sh ~/* 2>/dev/null | sort -rh | head -5

# 3. Listez les utilisateurs uniques connectés
who | cut -d' ' -f1 | sort -u

Exercice 3 : tee et xargs

# 1. Listez /etc, affichez et sauvegardez
ls /etc | tee etc_backup.txt

# 2. Créez 5 fichiers test avec xargs
echo "test1 test2 test3 test4 test5" | xargs touch

# 3. Vérifiez et supprimez
ls test*
echo "test1 test2 test3 test4 test5" | xargs rm

Exercice 4 : Pipeline complet

# Analysez /etc/passwd :
# 1. Extrayez les noms d'utilisateur (premier champ)
# 2. Triez-les
# 3. Comptez-les

cat /etc/passwd | cut -d: -f1 | sort | wc -l

Quiz

Q1. Comment rediriger stdout et stderr vers le même fichier ?

Réponse

commande > fichier.txt 2>&1 ou commande &> fichier.txt

Q2. À quoi sert /dev/null ?

Réponse

À ignorer/jeter une sortie. Tout ce qui est redirigé vers /dev/null disparaît.

Q3. Quelle est la différence entre > et >> ?

Réponse

> écrase le fichier, >> ajoute à la fin du fichier.

🔝 Retour à la table des matières



Points clés à retenir

  • stdin (0) = entrée, stdout (1) = sortie, stderr (2) = erreurs
  • > écrase, >> ajoute
  • 2> redirige stderr, &> redirige tout
  • | connecte stdout → stdin
  • /dev/null pour ignorer une sortie
  • tee divise vers fichier ET écran
  • xargs transforme stdin en arguments

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Exercices récapitulatifs →