Redirections et pipes
Table des matières
- stdin, stdout, stderr
- Redirections (
>,>>,<,2>) - Pipes : |
- tee et xargs
- Combinaisons avancées
- Exercices pratiques
1 - stdin, stdout, stderr
Les trois flux standards
Chaque processus Linux a trois flux de données :
| Flux | Descripteur | Usage |
|---|---|---|
| stdin | 0 | Entrée standard (clavier) |
| stdout | 1 | Sortie standard (résultats) |
| stderr | 2 | Erreurs 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
| Syntaxe | Effet |
|---|---|
> | Rediriger stdout (écrase) |
>> | Rediriger stdout (ajoute) |
2> | Rediriger stderr (écrase) |
2>> | Rediriger stderr (ajoute) |
&> | Rediriger stdout + stderr |
< | Rediriger stdin |
2>&1 | Envoyer 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 :
cat access.log: Lire le fichiergrep "404": Filtrer les erreurs 404cut -d' ' -f1: Extraire le premier champ (IP)sort: Trieruniq -c: Compter les occurrences uniquessort -rn: Trier par nombre décroissanthead -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
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
| Option | Effet |
|---|---|
-I {} | Placeholder pour l'argument |
-n N | N arguments par commande |
-P N | N commandes en parallèle |
-p | Demander confirmation |
-0 | Sé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,>>ajoute2>redirige stderr,&>redirige tout|connecte stdout → stdin/dev/nullpour ignorer une sortieteedivise vers fichier ET écranxargstransforme stdin en arguments
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Exercices récapitulatifs →