« 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:]_.-
'
tr A-Z a-ztr -str -dtr -cd07Compose 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.
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.