moyen · Durée estimée : 35 min
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é.
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
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.
ventes.txt et vérifie qu'il
contient bien 9 lignes.
wc -l ventes.txt doit afficher 9.
grep (Global Regular Expression Print)
cherche un motif dans un fichier et affiche les lignes
correspondantes.
grep Paris ventes.txt
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
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.
ventes.txt avec grep -c Paris ventes.txt.
3.
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
ventes.txt qui
ne contiennent pas "Paris" avec grep -v.
sed (Stream Editor) édite du texte
en flux. Sa commande la plus courante est la substitution
s/ancien/nouveau/.
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
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.
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
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é.
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".
awk est un langage complet de traitement
de texte. On l'utilise principalement pour extraire
des colonnes.
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.
awk -F';' '{print $1, $3}' ventes.txt # ville + montant
awk -F';' '{print $1" : "$3"€"}' v.txt # formatage
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
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.
awk -F';' '{sum+=$3} END {print sum}' ventes.txt.
93400.
Voici un scénario classique : analyser 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
grep -E " (4|5)[0-9][0-9]$" acces.log
grep -E " (4|5)[0-9][0-9]$" acces.log | awk '{print $3}'
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.
sed 's/403/interdit/g' acces.log
goaccess ou
awstats. En connaissant les commandes, tu
peux tout faire à la main.
/admin.
192.168.1.10 et
192.168.1.11.
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.
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.
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 '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 -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
grep ... | awk '{print $N}' | sort | uniq -c | sort -rn
C'est la chaîne d'analyse à connaître par cœur.
À partir de acces.log créé à l'étape 6 :
$4)acces_v2.logip_uniques.txtcat ip_uniques.txt doit afficher les 3 IP
distinctes : 192.168.1.10,
192.168.1.11, 192.168.1.50.
grep -P
(lookahead, lookbehind)ripgrep (rg), jq pour JSON,
sd pour sed plus simpleNe cherche pas à tout maîtriser d'un coup. Utilise-les au quotidien, et reviens consulter ce tutoriel en référence.