07 · Grep, Sed & Awk

moyen  ·  Durée estimée : 35 min

🎯 Objectif

Apprendre les trois outils de traitement de texte les plus puissants du shell Unix : grep pour chercher, sed pour transformer, awk pour extraire.

Ensemble, ils forment la base de l'analyse de logs, l'extraction de données et l'automatisation. Tu les utiliseras absolument tous les jours en administration système et en analyse sécurité.

1. Préparer un fichier de test

Avant de commencer, crée un fichier d'exemple :

cat > ventes.txt <<'EOF'
Paris;Janvier;12000
Lyon;Janvier;8500
Marseille;Janvier;9200
Paris;Février;13500
Lyon;Février;7800
Marseille;Février;9800
Paris;Mars;15200
Lyon;Mars;8300
Marseille;Mars;10100
EOF

Vérifie le contenu :

cat ventes.txt
Chaque ligne : Ville;Mois;Montant
<<'EOF' est une here-document : elle permet de saisir plusieurs lignes jusqu'à EOF. Très pratique pour créer un fichier de test rapidement.
Crée le fichier ventes.txt et vérifie qu'il contient bien 9 lignes.
wc -l ventes.txt doit afficher 9.
2. Grep — chercher dans un fichier

grep (Global Regular Expression Print) cherche un motif dans un fichier et affiche les lignes correspondantes.

Recherche simple

grep Paris ventes.txt
Affiche les 3 lignes contenant "Paris".

Options essentielles

grep -i mot fichier       # insensible à la casse
grep -v mot fichier       # lignes NE contenant PAS le mot
grep -c mot fichier       # compte les correspondances
grep -n mot fichier       # affiche les numéros de ligne
grep -w mot fichier       # mot entier seulement
grep -r mot dossier/      # récursif dans un dossier
grep -l mot *.txt         # liste les fichiers contenant le mot
grep -A 2 mot fichier     # 2 lignes APRÈS chaque correspondance
grep -B 2 mot fichier     # 2 lignes AVANT
grep -C 2 mot fichier     # 2 lignes avant ET après

Expressions régulières de base

grep "^Paris" ventes.txt    # commence par Paris
grep "Mars$" ventes.txt     # finit par Mars
grep "^$" ventes.txt        # lignes vides
grep "P.ris" ventes.txt     # . = n'importe quel caractère
grep "1[0-9]000" ventes.txt # plage de chiffres
grep -E "Paris|Lyon" v.txt  # OU logique (regex étendue)
grep -rn "erreur" /var/log/ est LA commande de débogage à connaître. Elle cherche "erreur" dans tous les fichiers de logs.
Compte combien de fois "Paris" apparaît dans ventes.txt avec grep -c Paris ventes.txt.
Tu dois obtenir 3.
3. Combiner grep avec d'autres commandes (pipe)

Le pipe | envoie la sortie d'une commande vers l'entrée d'une autre. C'est la base de la philosophie Unix.

cat ventes.txt | grep Paris
ps aux | grep sh
ls -la | grep ".txt"
cat /etc/passwd | grep -v "^#" | grep -v "^$"

Équivalents sans pipe (plus efficaces) :

grep Paris ventes.txt
ps aux | grep sh          # ici le pipe reste nécessaire
ls -la | grep ".txt"      # ici le pipe reste utile
grep -v "^#" /etc/passwd  # grep direct
Le pipe est plus efficace que d'enchaîner des commandes avec des fichiers temporaires. C'est aussi plus lisible.
Affiche toutes les lignes de ventes.txt qui ne contiennent pas "Paris" avec grep -v.
Tu dois obtenir 6 lignes.
4. Sed — transformer du texte

sed (Stream Editor) édite du texte en flux. Sa commande la plus courante est la substitution s/ancien/nouveau/.

Substitution de base

sed 's/Paris/Londres/' ventes.txt         # première occurrence par ligne
sed 's/Paris/Londres/g' ventes.txt        # toutes les occurrences
sed 's/Paris/Londres/2' ventes.txt        # 2e occurrence

Modifier le fichier en place

sed -i 's/Paris/Londres/g' ventes.txt     # -i modifie le fichier
sed -i modifie le fichier directement. Pas de corbeille, pas d'annulation possible. Fais une copie avant : cp ventes.txt ventes.txt.bak.

Supprimer des lignes

sed '3d' ventes.txt          # supprime la ligne 3
sed '2,4d' ventes.txt        # supprime les lignes 2 à 4
sed '/Paris/d' ventes.txt    # supprime les lignes contenant Paris
sed '$d' ventes.txt          # supprime la dernière ligne

Afficher une plage de lignes

sed -n '2,5p' ventes.txt     # affiche lignes 2 à 5
sed -n '/Paris/p' ventes.txt # comme grep
sed -n '2,$p' ventes.txt     # de la ligne 2 à la fin
sed -n 'Np' est équivalent à head -N | tail -1 pour la ligne N. Plus élégant une fois habitué.
Copie ventes.txt en ventes_modif.txt, puis remplace tous les "Janvier" par "Janv." avec sed -i.
cat ventes_modif.txt doit afficher "Janv." au lieu de "Janvier".
5. Awk — extraire des colonnes

awk est un langage complet de traitement de texte. On l'utilise principalement pour extraire des colonnes.

Extraire une colonne

awk -F';' '{print $1}' ventes.txt    # colonne 1 (ville)
awk -F';' '{print $2}' ventes.txt    # colonne 2 (mois)
awk -F';' '{print $3}' ventes.txt    # colonne 3 (montant)
-F';' définit le séparateur de champs. Par défaut, c'est l'espace.

Extraire plusieurs colonnes

awk -F';' '{print $1, $3}' ventes.txt    # ville + montant
awk -F';' '{print $1" : "$3"€"}' v.txt   # formatage

Filtrer

awk -F';' '$1=="Paris"' ventes.txt            # ville = Paris
awk -F';' '$3>10000' ventes.txt               # montant > 10000
awk -F';' '$1=="Paris" && $2=="Mars"' v.txt  # ET logique
awk -F';' '$1=="Lyon" || $1=="Paris"' v.txt   # OU logique

Calculer

awk -F';' '{sum+=$3} END {print sum}' ventes.txt       # somme
awk -F';' '{sum+=$3} END {print sum/NR}' ventes.txt    # moyenne
awk -F';' 'END {print NR}' ventes.txt                  # nombre de lignes
$1, $2… sont les colonnes. $0 est la ligne complète. NR est le numéro de ligne courant.
awk '{print $N}' est le couteau suisse de l'extraction. Tu l'utiliseras partout.
Calcule le total des ventes avec awk -F';' '{sum+=$3} END {print sum}' ventes.txt.
Tu dois obtenir 93400.
6. Combiner les trois — cas pratique

Voici un scénario classique : analyser un fichier de logs.

Créer un fichier de logs

cat > acces.log <<'EOF'
2026-11-20 10:15:32 192.168.1.10 GET /index.html 200
2026-11-20 10:15:35 192.168.1.11 GET /contact 200
2026-11-20 10:16:02 192.168.1.10 GET /admin 403
2026-11-20 10:17:15 192.168.1.50 POST /login 200
2026-11-20 10:18:01 192.168.1.11 GET /admin 403
2026-11-20 10:19:22 192.168.1.10 GET /index.html 200
2026-11-20 10:20:10 192.168.1.50 POST /login 500
EOF

Requête 1 : toutes les erreurs 4xx/5xx

grep -E " (4|5)[0-9][0-9]$" acces.log

Requête 2 : IP des utilisateurs en erreur

grep -E " (4|5)[0-9][0-9]$" acces.log | awk '{print $3}'

Requête 3 : compter les erreurs par IP

grep -E " (4|5)[0-9][0-9]$" acces.log | awk '{print $3}' | sort | uniq -c | sort -rn
sort trie, uniq -c compte les occurrences consécutives, sort -rn trie par nombre décroissant.

Requête 4 : remplacer les 403 par "interdit"

sed 's/403/interdit/g' acces.log
C'est exactement ce type d'analyse que font les outils comme goaccess ou awstats. En connaissant les commandes, tu peux tout faire à la main.
Affiche la liste des IP ayant fait une requête vers /admin.
Tu dois obtenir 192.168.1.10 et 192.168.1.11.
7. Redirections — rappel express

Indispensable pour combiner avec grep/sed/awk :

commande > fichier       # écrase le fichier
commande >> fichier      # ajoute à la fin
commande 2> erreurs.txt  # redirige les erreurs
commande 2>&1            # erreurs + sortie standard
commande < fichier       # lire depuis un fichier
commande | autre         # pipe (chaînage)
grep error /var/log/* 2>/dev/null → cherche partout, jette les erreurs de permission.
/dev/null est un "trou noir" : tout ce qu'on y écrit disparaît. Utile pour les messages indésirables.
Sauvegarde la liste des IP en erreur dans un fichier ip_suspectes.txt :
grep -E " (4|5)[0-9][0-9]$" acces.log | awk '{print $3}' | sort -u > ip_suspectes.txt
cat ip_suspectes.txt doit montrer une liste d'IP uniques.
🎓 Récapitulatif

Grep

grep mot fichier          → chercher
grep -i -v -c -n          → options de base
grep -r mot dossier/      → récursif
grep -E "a|b"             → OU logique
grep "^deb" fichier       → commence par
grep "fin$" fichier       → finit par

Sed

sed 's/a/b/' fichier      → remplacer 1re occurrence
sed 's/a/b/g' fichier     → remplacer partout
sed -i 's/a/b/g' f.txt    → modifier en place
sed '3d' fichier          → supprimer ligne 3
sed -n '2,5p' fichier     → afficher lignes 2-5

Awk

awk -F';' '{print $1}'          → extraire colonne 1
awk -F';' '{print $1,$3}'       → colonnes 1 et 3
awk -F';' '$3>1000'            → filtrer
awk -F';' '{sum+=$3} END {print sum}' → somme

Combinés

grep ... | awk '{print $N}' | sort | uniq -c | sort -rn

C'est la chaîne d'analyse à connaître par cœur.

🏆 Défi final

À partir de acces.log créé à l'étape 6 :

  1. Afficher les lignes contenant "POST"
  2. Afficher les lignes avec le code 200 uniquement
  3. Extraire la colonne des URLs ($4)
  4. Compter combien de fois chaque URL apparaît
  5. Remplacer "POST" par "UPLOAD" et sauvegarder dans acces_v2.log
  6. Afficher les 3 dernières lignes du fichier
  7. Sauvegarder les IP uniques dans ip_uniques.txt
cat ip_uniques.txt doit afficher les 3 IP distinctes : 192.168.1.10, 192.168.1.11, 192.168.1.50.
Tu viens d'utiliser les trois outils qui font la réputation du shell Unix. Ensemble, ils remplacent 90 % des scripts d'analyse de texte que les gens écrivent en Python.
📖 Pour aller plus loin

Ne cherche pas à tout maîtriser d'un coup. Utilise-les au quotidien, et reviens consulter ce tutoriel en référence.

📚 Sommaire