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

  1. grep " 500 " : filtre les lignes avec une erreur 500
  2. awk '{print $1}' : extrait le premier champ (l'IP)
  3. sort : trie pour regrouper les doublons
  4. uniq -c : compte les occurrences
  5. sort -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.