Linux — utilisation avancée et administration · Étape 22

Filtre et transforme avec grep, sed et tr

Sélectionne les lignes pertinentes, extrait des champs, normalise une configuration et vérifie chaque transformation.

Durée indicative · ~1 h 30Niveau intermédiairePrérequis conseillé · Leçon 21 — expressions rationnellesPratique · TP
L’idée reçue

« Une longue chaîne de pipes est forcément une bonne automatisation. »

Chaque étape doit avoir une intention claire, un format d’entrée connu et une sortie vérifiable. Lorsque la chaîne devient opaque, il faut enregistrer les résultats intermédiaires ou passer à awk ou à un script.

01Filtre avec contexte

export LAB="/tmp/soria-linux-text-$USER"
grep -nE 'status=(4|5)[0-9]{2}' "$LAB/data/access.log"
grep -n -B1 -A1 'status=500' "$LAB/data/access.log"
grep -nE 'Failed password|Accepted publickey' "$LAB/data/auth.log"

-n conserve le numéro de ligne. -B et -A ajoutent du contexte autour d’un événement sans ouvrir tout le fichier.

02Extrait uniquement les valeurs

grep -Eo 'status=[0-9]{3}' "$LAB/data/access.log"
grep -Eo 'client=[0-9.]+' "$LAB/data/access.log"
grep -Eo 'from [0-9.]+' "$LAB/data/auth.log" | sed 's/^from //'
grep -o retourne seulement la portion correspondante. Cela réduit les étapes suivantes, mais peut perdre le contexte nécessaire à l’interprétation.

03Transforme une copie avec sed

cp "$LAB/data/app.conf" "$LAB/tmp/app.conf.work"
sed -E 's/^[[:space:]]*([^#][^=]*)[[:space:]]*=[[:space:]]*/\1=/' "$LAB/tmp/app.conf.work" > "$LAB/tmp/app.conf.normalized"
cat "$LAB/tmp/app.conf.normalized"

La source reste intacte. La substitution retire les espaces autour du premier signe égal pour les lignes actives.

04Modifie une valeur ciblée

sed -E 's/^(LOG_LEVEL)[[:space:]]*=.*/\1=warning/' "$LAB/tmp/app.conf.normalized" > "$LAB/tmp/app.conf.changed"
diff -u "$LAB/tmp/app.conf.normalized" "$LAB/tmp/app.conf.changed" || true

L’ancre de début et le nom exact de la clé évitent de modifier une autre valeur contenant le même mot.

05Utilise des adresses sed

sed -n '2,4p' "$LAB/data/inventory.csv"
sed -n '/Failed password/,/Accepted publickey/p' "$LAB/data/auth.log"

Une adresse peut être numérique ou définie par deux motifs. La commande -n désactive l’impression implicite ; p imprime seulement la plage choisie.

06Normalise avec tr

printf '%s
' 'Degraded SERVICE State' | tr '[:upper:]' '[:lower:]'

printf 'alpha    beta		gamma
' | tr -s '[:space:]' ' '

printf '%s
' 'host-01.prod' | tr -cd '[:alnum:]_.-
'
Commande
Effet
Précaution
tr A-Z a-z
traduire des caractères
préférer les classes pour la locale
tr -s
réduire les répétitions
le séparateur peut changer
tr -d
supprimer
risque de perte irréversible
tr -cd
conserver seulement un ensemble
inclure explicitement le retour ligne

07Compose une chaîne observable

grep -Eo 'status=[0-9]{3}' "$LAB/data/access.log" | sed 's/status=//' | sort | uniq -c | tee "$LAB/reports/status-counts.raw"

tee conserve une preuve intermédiaire. La prochaine leçon structurera cette agrégation.

Challenge autonome

Nettoie une configuration

À partir de app.conf, produis une nouvelle version sans espace autour de =, avec LOG_LEVEL=warning, sans supprimer les commentaires. Montre le diff et prouve que le fichier source est inchangé.

Ce que tu retiens

grep sélectionne, sed transforme des lignes et tr agit sur des caractères. Une transformation sûre travaille sur une copie, montre son diff et conserve assez de contexte pour être expliquée.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.