DevOpsFacile
AccueilParcours de formationCertificationsModulesCheat SheetÀ Propos
DevOpsFacile

Une plateforme d'apprentissage complète pour maîtriser les pratiques DevOps modernes, du débutant à l'expert.

contact@devopsfacile.fr

Formation

  • Parcours de formation
  • Modules

Informations

  • À Propos
  • Conditions d'utilisation
  • Confidentialité
  • Mentions légales

© 2026 DevOps Facile. Tous droits réservés.

Fait avec pour la communauté DevOps

ModulesMaîtriser Linux : permissions, processus et paquets05 - Flux, pipes et traitement de texte

Détails

  • 20 minutes
  • Intermédiaire

Objectifs

  • Maîtriser les redirections stdin, stdout et stderr
  • Chaîner des commandes avec les pipes
  • Utiliser sort, uniq, cut, sed et awk
  • Construire des pipelines de traitement de données
Module Maîtriser Linux : permissions, processus et paquets

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' ... EOF pour é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 fichier affiche les lignes contenant le motif. -v inverse le filtre (affiche les lignes qui NE contiennent PAS le motif). -c compte 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 -l compte 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'ordre sort | uniq -c est 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' ' -f4 extrait la 4e colonne séparée par des espaces. awk '{print $4}' fait la même chose. Combinez avec sort | uniq pour 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) :

bash
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
EOF

Répondez à ces 5 questions avec des pipelines :

  1. Combien y a-t-il d'erreurs (ERROR) au total ?
  2. Quelle IP a générée le plus d'erreurs ?
  3. Quelles URLs ont retourné une erreur 500 ? (liste unique, sans doublons)
  4. Combien de requêtes distinctes par code HTTP ? (un tableau code : nombre)
  5. 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.log affiche 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 :

  1. Créez un espace de travail :
bash
cd ~
mkdir -p exercice-pipes
cd exercice-pipes
  1. Créez un fichier de log simulé :
bash
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
  1. Créez un fichier CSV de données :
bash
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 :

  1. Rediriger stdout vers un fichier (écrase) :
bash
ls /etc > liste-etc.txt
head -5 liste-etc.txt
  1. Ajouter à la fin d'un fichier :
bash
echo "--- Ajouté le $(date) ---" >> liste-etc.txt
tail -2 liste-etc.txt
  1. Rediriger les erreurs séparément :
bash
ls /dossier-inexistant 2> erreurs.txt
cat erreurs.txt

Résultat attendu :

ls: cannot access '/dossier-inexistant': No such file or directory

L'erreur va dans le fichier au lieu de s'afficher à l'écran.

  1. Rediriger stdout ET stderr dans le même fichier :
bash
ls /etc /dossier-inexistant &> tout.txt
cat tout.txt

Vous verrez le listing ET l'erreur dans tout.txt.

  1. Ignorer complètement la sortie :
bash
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 :

  1. Compter le nombre de lignes dans le log :
bash
cat access.log | wc -l

Résultat attendu : 15

  1. Chercher les erreurs :
bash
cat access.log | grep "ERROR"

Résultat attendu : Les 4 lignes contenant ERROR.

  1. Compter les erreurs :
bash
grep "ERROR" access.log | wc -l

Résultat attendu : 4

  1. Chercher les erreurs 500 (erreur serveur) :
bash
grep "500" access.log
  1. Afficher les 3 dernières lignes du log :
bash
cat access.log | tail -3

Étape 4 : Trier et Dédupliquer

Objectif : Utiliser sort et uniq

Instructions :

  1. Extraire toutes les adresses IP du log :
bash
cat access.log | awk '{print $4}'

awk '{print $4}' affiche la 4ème colonne (séparée par des espaces).

  1. Trier les IPs :
bash
cat access.log | awk '{print $4}' | sort
  1. Supprimer les doublons :
bash
cat access.log | awk '{print $4}' | sort | uniq

Résultat attendu :

10.0.0.100
10.0.0.5
192.168.1.10
192.168.1.20
192.168.1.30
  1. Compter les occurrences de chaque IP :
bash
cat access.log | awk '{print $4}' | sort | uniq -c | sort -rn

Ré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.100

L'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 pour uniq)

→ 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 :

  1. Extraire les noms du fichier CSV :
bash
cut -d',' -f1 utilisateurs.csv

-d',' = séparateur virgule, -f1 = premier champ

  1. Extraire nom et département :
bash
cut -d',' -f1,4 utilisateurs.csv
  1. Avec awk (plus puissant) - extraire les développeurs :
bash
awk -F',' '$4 == "Dev" {print $1, $2, $5}' utilisateurs.csv

Résultat attendu :

Dupont Alice 45000
Durand Charlie 52000
Moreau Eve 55000
Robert Hugo 50000
  1. Calculer la somme des salaires du département Dev :
bash
awk -F',' '$4 == "Dev" {total += $5} END {print "Total Dev:", total}' utilisateurs.csv

Résultat attendu :

Total Dev: 202000

Étape 6 : Transformer du Texte avec sed

Objectif : Utiliser sed pour remplacer et transformer

Instructions :

  1. Remplacer "ERROR" par "[ERREUR]" dans l'affichage :
bash
sed 's/ERROR/[ERREUR]/g' access.log | grep ERREUR
  1. Supprimer les lignes INFO (ne garder que les problèmes) :
bash
sed '/INFO/d' access.log

Résultat attendu : Seules les lignes ERROR et WARNING restent.

  1. Extraire juste l'heure de chaque log :
bash
cut -d' ' -f2 access.log
  1. Remplacer les virgules par des points-virgules dans le CSV :
bash
sed 's/,/;/g' utilisateurs.csv

Étape 7 : Pipelines Complexes - Analyse de Logs

Objectif : Combiner tout pour des analyses avancées

Instructions :

  1. Top 3 des pages les plus visitées :
bash
awk '{print $6}' access.log | sort | uniq -c | sort -rn | head -3

Résultat attendu :

      3 /index.html
      2 /missing.html
      1 /style.css
  1. Codes de réponse HTTP les plus fréquents :
bash
awk '{print $7}' access.log | sort | uniq -c | sort -rn
  1. Toutes les IPs qui ont eu des erreurs 5xx :
bash
grep " 500" access.log | awk '{print $4}' | sort -u

sort -u = trier et supprimer les doublons en une seule étape.

  1. Résumé : nombre de requêtes par niveau de log :
bash
awk '{print $3}' access.log | sort | uniq -c | sort -rn

Résultat attendu :

      9 INFO
      4 ERROR
      2 WARNING
  1. Rapport complet en une ligne :
bash
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

bash
cd ~
rm -r exercice-pipes

✅ Vérification Finale

  1. Quelle est la différence entre > et >> ? → > écrase, >> ajoute
  2. Comment ignorer les erreurs d'une commande ? → commande 2>/dev/null
  3. Comment compter les lignes contenant "error" dans un fichier ? → grep -c "error" fichier
  4. Comment voir les 5 mots les plus fréquents dans un fichier ? → cat fichier | tr ' ' '\n' | sort | uniq -c | sort -rn | head -5
  5. Que fait awk '{print $3}' ? → Affiche la 3ème colonne de chaque ligne

📖 Pour Aller Plus Loin

  • Étudiez tr pour 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 jq pour traiter du JSON en ligne de commande : apt install jq
  • Consultez man awk - AWK est un véritable langage de programmation
Retour au module

Sur cette page

  • 🎯 Objectifs
  • 📖 Contexte
  • 📋 Énoncé
  • 🧭 Déroulement de l'exercice
  • Tâche 1 : Préparer les données de test
  • Tâche 2 : Maîtriser les redirections
  • Tâche 3 : Filtrer avec grep
  • Tâche 4 : Compter et trier avec sort, uniq, wc
  • Tâche 5 : Extraire des colonnes avec cut ou awk
  • Tâche 6 : Construire un pipeline d'analyse complet
  • � Mini-Projet : Analyser un incident de production
  • �📚 Étapes Détaillées
  • Étape 1 : Préparer les Données de Test
  • Étape 2 : Les Redirections
  • Étape 3 : Les Pipes - Bases
  • Étape 4 : Trier et Dédupliquer
  • Étape 5 : Couper et Extraire des Colonnes
  • Étape 6 : Transformer du Texte avec sed
  • Étape 7 : Pipelines Complexes - Analyse de Logs
  • Étape 8 : Nettoyage
  • ✅ Vérification Finale
  • 📖 Pour Aller Plus Loin