Exercice 05 : Flux, Pipes et Traitement de Texte
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Rediriger la sortie standard et la sortie d'erreur
- ✅ Combiner des commandes avec le pipe
| - ✅ Trier, filtrer et transformer du texte avec
sort,uniq,cut,sed - ✅ Construire des pipelines complexes pour analyser des données
- ✅ Analyser des fichiers de log comme un professionnel
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Avoir complété les exercices 01 à 04
- Connaître les commandes de base (
cat,grep,ls)
📖 Contexte
Les pipes et les redirections sont le superpouvoir de Linux. Ils permettent de combiner des commandes simples en outils puissants. En DevOps, vous les utiliserez constamment :
- Analyser des logs de serveur pour trouver des erreurs
- Extraire des statistiques de performance
- Transformer des données de configuration
- Automatiser le traitement de fichiers
La philosophie Unix : chaque commande fait une chose simple, et les pipes les connectent.
📋 Énoncé
Vous êtes en charge d'un serveur web. Vous avez des fichiers de logs à analyser pour identifier les problèmes, compter les visiteurs et extraire des statistiques. Vous devez le faire uniquement avec des commandes en ligne - pas de langage de programmation.
🧭 Déroulement de l'exercice
Voici les grandes étapes à réaliser dans l'ordre. Chaque étape décrit ce que vous devez accomplir - à vous de trouver la commande. La solution complète est disponible si vous êtes bloqué.
Tâche 1 : Préparer les données de test
Créez un dossier exercice-pipes/ et générez dedans un fichier access.log simulant des logs de serveur web (plusieurs colonnes : date, niveau, IP, méthode, URL, code HTTP).
Indice : Utilisez
cat > fichier << 'EOF' ... EOFpour écrire plusieurs lignes dans un fichier. Lisez ensuite le fichier pour bien comprendre sa structure : chaque colonne sera important pour les tâches suivantes.
Vérification : cat access.log doit afficher au moins 10 lignes avec des niveaux variés (INFO, ERROR, WARNING).
Tâche 2 : Maîtriser les redirections
Redirigez la sortie de plusieurs commandes vers des fichiers. Testez > (écrasement), >> (ajout) et 2> (erreurs).
Indice :
>écrase le fichier existant.>>ajoute à la fin.2>redirige la sortie d'erreur. Essayez de provoquer une erreur volontaire (ls /dossier-inexistant) et redirigez-la vers un fichier.
Question à se poser : Que se passe-t-il si vous utilisez > sur un fichier qui contient déjà des données importantes ?
Vérification : Un fichier errors.txt doit contenir uniquement des messages d'erreur, séparé du contenu normal.
Tâche 3 : Filtrer avec grep
Extrayez uniquement les lignes d'erreur ("ERROR") du log, puis uniquement les lignes qui ne sont pas des INFO.
Indice :
grep motif fichieraffiche les lignes contenant le motif.-vinverse le filtre (affiche les lignes qui NE contiennent PAS le motif).-ccompte les occurrences sans les afficher.
Vérification : Vous devez trouver exactement 3 lignes ERROR et 1 ligne WARNING dans le fichier de test.
Tâche 4 : Compter et trier avec sort, uniq, wc
Comptez le nombre total de lignes dans le log. Identifiez les codes HTTP présents et combien de fois chacun apparaît.
Indice :
wc -lcompte les lignes. Pour compter les occurrences d'une valeur, la technique est : extraire la colonne → trier →uniq -c(qui compte les lignes identiques consécutives). L'ordresort | uniq -cest fondamental.
Question à se poser : Pourquoi doit-on faire sort AVANT uniq -c ? Que se passe-t-il si on ne le fait pas ?
Vérification : Vous devez obtenir un tableau du type : X 200, Y 404, Z 500.
Tâche 5 : Extraire des colonnes avec cut ou awk
Extrayez uniquement les adresses IP de chaque ligne du log (4e colonne). Listez les IPs uniques.
Indice :
cut -d' ' -f4extrait la 4e colonne séparée par des espaces.awk '{print $4}'fait la même chose. Combinez avecsort | uniqpour dédupliquer.
Vérification : Vous devez obtenir une liste de 3 adresses IP distinctes (192.168.1.10, 192.168.1.20, etc.).
Tâche 6 : Construire un pipeline d'analyse complet
Constituez un pipeline qui répond à cette question : "Quelle est l'adresse IP la plus active dans les logs ?" Le résultat doit être trié par nombre de requêtes, du plus au moins actif.
Indice : Assemblez ce que vous avez appris : extraire la colonne IP → trier → compter les occurrences → trier à nouveau par nombre. Construisez le pipeline progressivement, commande par commande, en observant le résultat intermédiaire à chaque
|.
Question à se poser : Comment inverser l'ordre de tri pour avoir le plus grand nombre en premier ?
Vérification : Votre pipeline en une ligne doit afficher les IPs avec leur nombre de requêtes, la plus active en tête.
� Mini-Projet : Analyser un incident de production
Vous allez mener une analyse complète de logs comme le ferait un ingénieur DevOps lors d'un incident, en construisant des pipelines progressivement plus complexes.
Scénario : Une alerte a été déclenchée à 3h du matin. Le lendemain matin, vous analysez les logs pour comprendre ce qui s'est passé. Vous devez répondre à 5 questions précises en utilisant uniquement des commandes shell.
Préparez d'abord ce fichier de log enrichi (copiez-collez dans votre terminal) :
cat > incident.log << 'EOF'
2026-04-10 02:58:01 INFO 10.0.0.1 GET /api/health 200
2026-04-10 02:58:30 INFO 10.0.0.2 GET /dashboard 200
2026-04-10 02:59:00 ERROR 10.0.0.3 POST /api/login 500
2026-04-10 02:59:15 ERROR 10.0.0.3 POST /api/login 500
2026-04-10 02:59:30 ERROR 10.0.0.3 POST /api/login 500
2026-04-10 03:00:01 WARNING 10.0.0.4 GET /admin 403
2026-04-10 03:00:45 ERROR 10.0.0.1 GET /api/data 500
2026-04-10 03:01:10 INFO 10.0.0.2 GET /index.html 200
2026-04-10 03:01:30 ERROR 10.0.0.5 DELETE /api/users 500
2026-04-10 03:01:55 WARNING 10.0.0.3 POST /api/login 401
2026-04-10 03:02:10 INFO 10.0.0.1 GET /api/health 200
2026-04-10 03:02:40 ERROR 10.0.0.5 DELETE /api/users 500
EOFRépondez à ces 5 questions avec des pipelines :
- Combien y a-t-il d'erreurs (ERROR) au total ?
- Quelle IP a générée le plus d'erreurs ?
- Quelles URLs ont retourné une erreur 500 ? (liste unique, sans doublons)
- Combien de requêtes distinctes par code HTTP ? (un tableau
code : nombre) - Sauvegardez la liste des lignes ERROR dans un fichier
errors-only.log
Checkpoints de validation :
- La réponse à la question 1 est un nombre (une commande, un résultat)
- La réponse à la question 2 identifie une seule IP avec son nombre d'erreurs
- La réponse à la question 3 liste 3 URLs distinctes
- La réponse à la question 4 affiche un tableau de 4 lignes (200, 401, 403, 500)
cat errors-only.logaffiche uniquement les lignes contenant "ERROR" (6 lignes)- Chaque réponse a été obtenue avec un pipeline d'au moins 2 commandes reliées par
|
�📚 Étapes Détaillées
Étape 1 : Préparer les Données de Test
Instructions :
- Créez un espace de travail :
cd ~
mkdir -p exercice-pipes
cd exercice-pipes- Créez un fichier de log simulé :
cat > access.log << 'EOF'
2026-04-10 08:15:23 INFO 192.168.1.10 GET /index.html 200
2026-04-10 08:15:45 INFO 192.168.1.20 GET /about.html 200
2026-04-10 08:16:02 ERROR 192.168.1.10 GET /missing.html 404
2026-04-10 08:16:30 INFO 10.0.0.5 POST /api/login 200
2026-04-10 08:17:01 WARNING 192.168.1.30 GET /admin 403
2026-04-10 08:17:15 INFO 192.168.1.10 GET /index.html 200
2026-04-10 08:18:00 ERROR 10.0.0.5 POST /api/data 500
2026-04-10 08:18:22 INFO 192.168.1.20 GET /contact.html 200
2026-04-10 08:19:00 INFO 192.168.1.10 GET /style.css 200
2026-04-10 08:19:30 ERROR 192.168.1.30 GET /missing.html 404
2026-04-10 08:20:00 INFO 10.0.0.5 GET /dashboard 200
2026-04-10 08:20:15 INFO 192.168.1.10 GET /index.html 200
2026-04-10 08:21:00 ERROR 10.0.0.100 POST /api/upload 500
2026-04-10 08:21:30 WARNING 192.168.1.20 GET /old-page 301
2026-04-10 08:22:00 INFO 10.0.0.5 GET /api/status 200
EOF- Créez un fichier CSV de données :
cat > utilisateurs.csv << 'EOF'
nom,prenom,email,departement,salaire
Dupont,Alice,alice@example.com,Dev,45000
Martin,Bob,bob@example.com,Ops,48000
Durand,Charlie,charlie@example.com,Dev,52000
Petit,Diana,diana@example.com,QA,41000
Moreau,Eve,eve@example.com,Dev,55000
Garcia,Frank,frank@example.com,Ops,47000
Thomas,Grace,grace@example.com,QA,43000
Robert,Hugo,hugo@example.com,Dev,50000
EOFÉtape 2 : Les Redirections
Objectif : Comprendre >, >>, 2> et &>
Instructions :
- Rediriger stdout vers un fichier (écrase) :
ls /etc > liste-etc.txt
head -5 liste-etc.txt- Ajouter à la fin d'un fichier :
echo "--- Ajouté le $(date) ---" >> liste-etc.txt
tail -2 liste-etc.txt- Rediriger les erreurs séparément :
ls /dossier-inexistant 2> erreurs.txt
cat erreurs.txtRésultat attendu :
ls: cannot access '/dossier-inexistant': No such file or directoryL'erreur va dans le fichier au lieu de s'afficher à l'écran.
- Rediriger stdout ET stderr dans le même fichier :
ls /etc /dossier-inexistant &> tout.txt
cat tout.txtVous verrez le listing ET l'erreur dans tout.txt.
- Ignorer complètement la sortie :
ls /etc > /dev/null 2>&1/dev/null est le "trou noir" de Linux - tout ce qu'on y envoie disparaît.
Étape 3 : Les Pipes - Bases
Objectif : Chaîner des commandes avec |
Instructions :
- Compter le nombre de lignes dans le log :
cat access.log | wc -lRésultat attendu : 15
- Chercher les erreurs :
cat access.log | grep "ERROR"Résultat attendu : Les 4 lignes contenant ERROR.
- Compter les erreurs :
grep "ERROR" access.log | wc -lRésultat attendu : 4
- Chercher les erreurs 500 (erreur serveur) :
grep "500" access.log- Afficher les 3 dernières lignes du log :
cat access.log | tail -3Étape 4 : Trier et Dédupliquer
Objectif : Utiliser sort et uniq
Instructions :
- Extraire toutes les adresses IP du log :
cat access.log | awk '{print $4}'awk '{print $4}' affiche la 4ème colonne (séparée par des espaces).
- Trier les IPs :
cat access.log | awk '{print $4}' | sort- Supprimer les doublons :
cat access.log | awk '{print $4}' | sort | uniqRésultat attendu :
10.0.0.100
10.0.0.5
192.168.1.10
192.168.1.20
192.168.1.30- Compter les occurrences de chaque IP :
cat access.log | awk '{print $4}' | sort | uniq -c | sort -rnRésultat attendu :
5 192.168.1.10
4 10.0.0.5
3 192.168.1.20
2 192.168.1.30
1 10.0.0.100L'IP 192.168.1.10 est la plus active avec 5 requêtes.
Explication du pipeline :
awk '{print $4}'→ extrait les IPs→
sort→ trie alphabétiquement (nécessaire pouruniq)→
uniq -c→ compte les doublons consécutifs→
sort -rn→ trie par nombre décroissant
Étape 5 : Couper et Extraire des Colonnes
Objectif : Utiliser cut et awk pour extraire des données
Instructions :
- Extraire les noms du fichier CSV :
cut -d',' -f1 utilisateurs.csv-d',' = séparateur virgule, -f1 = premier champ
- Extraire nom et département :
cut -d',' -f1,4 utilisateurs.csv- Avec
awk(plus puissant) - extraire les développeurs :
awk -F',' '$4 == "Dev" {print $1, $2, $5}' utilisateurs.csvRésultat attendu :
Dupont Alice 45000
Durand Charlie 52000
Moreau Eve 55000
Robert Hugo 50000- Calculer la somme des salaires du département Dev :
awk -F',' '$4 == "Dev" {total += $5} END {print "Total Dev:", total}' utilisateurs.csvRésultat attendu :
Total Dev: 202000Étape 6 : Transformer du Texte avec sed
Objectif : Utiliser sed pour remplacer et transformer
Instructions :
- Remplacer "ERROR" par "[ERREUR]" dans l'affichage :
sed 's/ERROR/[ERREUR]/g' access.log | grep ERREUR- Supprimer les lignes INFO (ne garder que les problèmes) :
sed '/INFO/d' access.logRésultat attendu : Seules les lignes ERROR et WARNING restent.
- Extraire juste l'heure de chaque log :
cut -d' ' -f2 access.log- Remplacer les virgules par des points-virgules dans le CSV :
sed 's/,/;/g' utilisateurs.csvÉtape 7 : Pipelines Complexes - Analyse de Logs
Objectif : Combiner tout pour des analyses avancées
Instructions :
- Top 3 des pages les plus visitées :
awk '{print $6}' access.log | sort | uniq -c | sort -rn | head -3Résultat attendu :
3 /index.html
2 /missing.html
1 /style.css- Codes de réponse HTTP les plus fréquents :
awk '{print $7}' access.log | sort | uniq -c | sort -rn- Toutes les IPs qui ont eu des erreurs 5xx :
grep " 500" access.log | awk '{print $4}' | sort -usort -u = trier et supprimer les doublons en une seule étape.
- Résumé : nombre de requêtes par niveau de log :
awk '{print $3}' access.log | sort | uniq -c | sort -rnRésultat attendu :
9 INFO
4 ERROR
2 WARNING- Rapport complet en une ligne :
echo "=== Rapport ===" && echo "Total requêtes: $(wc -l < access.log)" && echo "Erreurs: $(grep -c ERROR access.log)" && echo "IPs uniques: $(awk '{print $4}' access.log | sort -u | wc -l)"Résultat attendu :
=== Rapport ===
Total requêtes: 15
Erreurs: 4
IPs uniques: 5Étape 8 : Nettoyage
cd ~
rm -r exercice-pipes✅ Vérification Finale
- Quelle est la différence entre
>et>>? →>écrase,>>ajoute - Comment ignorer les erreurs d'une commande ? →
commande 2>/dev/null - Comment compter les lignes contenant "error" dans un fichier ? →
grep -c "error" fichier - Comment voir les 5 mots les plus fréquents dans un fichier ? →
cat fichier | tr ' ' '\n' | sort | uniq -c | sort -rn | head -5 - Que fait
awk '{print $3}'? → Affiche la 3ème colonne de chaque ligne
📖 Pour Aller Plus Loin
- Étudiez
trpour les transformations de caractères :echo "HELLO" | tr 'A-Z' 'a-z' - Apprenez les expressions régulières avec
grep -E(déjà très utile dans ce domaine) - Essayez
jqpour traiter du JSON en ligne de commande :apt install jq - Consultez
man awk- AWK est un véritable langage de programmation