grep, sed et awk font partie de ces outils que l'on rencontre inévitablement dès qu'on travaille sous Linux, dans une documentation, un script shell, une réponse sur Stack Overflow ou maintenant avec les LLM. On les copie-colle souvent sans vraiment comprendre ce qu'ils font. Pourtant, ces trois commandes couvrent l'essentiel des besoins de traitement de texte en ligne de commande.
grep : filtrer des lignes
grep est le plus simple et le plus utilisé des trois. Son rôle : rechercher des lignes qui correspondent à un motif dans un fichier ou dans le flux d'entrée standard.
grep "error" app.log
Cette commande affiche toutes les lignes du fichier app.log contenant le mot "error". Quelques options utiles :
-i: insensible à la casse-r: recherche récursive dans un dossier-n: affiche les numéros de ligne-l: affiche uniquement les noms de fichiers correspondants-v: inverse la sélection (lignes qui ne correspondent pas)-E: active les expressions régulières étendues
Exemples :
# Chercher "Exception" dans tous les fichiers PHP du projet
grep -rn "Exception" src/
# Afficher les lignes qui ne sont pas des commentaires
grep -v "^#" config.ini
# Chercher une IP dans les logs Apache
grep -E "^192\.168\." access.log
grep ne modifie rien : il filtre et affiche. C'est son point fort, on peut l'enchaîner avec d'autres commandes via le pipe | sans risque.
sed : transformer des lignes
sed (stream editor) va plus loin : il modifie le contenu ligne par ligne. Son usage le plus courant est la substitution, avec la syntaxe s/ancien/nouveau/ :
sed 's/foo/bar/g' fichier.txt
Le g en fin de commande applique le remplacement sur toutes les occurrences de la ligne, pas seulement la première. Par défaut, sed affiche le résultat sans modifier le fichier original. Pour modifier directement le fichier, on utilise l'option -i :
sed -i 's/localhost/127.0.0.1/g' config.php
Autres exemples :
# Supprimer les lignes vides
sed '/^$/d' fichier.txt
# Afficher uniquement les lignes 10 à 20
sed -n '10,20p' fichier.txt
# Supprimer les lignes contenant "DEBUG"
sed '/DEBUG/d' app.log
sed est particulièrement utile pour des modifications en masse sur des fichiers : remplacer une chaîne dans des dizaines de fichiers de configuration, nettoyer un export CSV, supprimer des lignes parasites dans un log.
awk : analyser et structurer
awk est le plus puissant des trois et le plus déroutant au premier abord. Il traite chaque ligne en la découpant en champs séparés par un délimiteur (par défaut, l'espace ou la tabulation). $1 désigne le premier champ, $2 le deuxième, $0 la ligne entière.
awk '{print $1}' fichier.txt
Cette commande affiche uniquement le premier champ de chaque ligne. On peut changer le séparateur avec -F :
# Afficher le nom d'utilisateur depuis /etc/passwd (séparateur ":")
awk -F: '{print $1}' /etc/passwd
# Afficher les colonnes 1 et 3 d'un CSV
awk -F',' '{print $1, $3}' export.csv
awk permet aussi des conditions et des calculs :
# Afficher les lignes dont le 3e champ dépasse 1000
awk '$3 > 1000' fichier.txt
# Calculer la somme d'une colonne
awk '{sum += $2} END {print "Total:", sum}' fichier.txt
# Compter les occurrences d'une valeur
awk '{count[$1]++} END {for (k in count) print k, count[k]}' fichier.txt
Là où grep filtre et sed transforme, awk agrège et analyse. Il est particulièrement adapté aux logs structurés, aux exports CSV ou aux fichiers texte tabulaires.
Combiner les trois avec le pipe
La vraie puissance de ces outils apparaît quand on les combine. Le pipe | passe la sortie d'une commande en entrée de la suivante :
# Dans les logs Apache, extraire les IPs des erreurs 500 et les compter par occurrence
grep " 500 " access.log | awk '{print $1}' | sort | uniq -c | sort -rn
Décomposé :
grep " 500 ": filtre les lignes avec une erreur 500awk '{print $1}': extrait le premier champ (l'IP)sort: trie pour regrouper les doublonsuniq -c: compte les occurrencessort -rn: trie par nombre décroissant
En une ligne, sans écrire un seul script, on obtient le classement des IPs à l'origine des erreurs 500.
Ces trois outils ont plus de 40 ans d'existence et restent présents dans la quasi-totalité des distributions Linux. Ils ne remplaceront pas d'autres langages pour des traitements complexes, mais pour des opérations ponctuelles sur des fichiers texte ou des logs, ils font le travail en une ligne.







