Comment analyser et modifier les fichiers de configuration Linux en utilisant sed et awk
Les fichiers de configuration Linux sont souvent en texte clair, ce qui les rend facilement modifiables à l'aide d'outils en ligne de commande. Parmi les plus puissants de ces outils se trouvent sed et awk.
Alors que les débutants peuvent s'appuyer sur l'édition manuelle avec vi ou nano, les administrateurs système expérimentés se tournent fréquemment vers ces outils pour l'analyse automatisée et la réécriture des fichiers de configuration.
Ces outils vous permettent de faire correspondre des motifs, d'extraire des champs et même d'effectuer des changements en temps réel dans les fichiers de configuration, le tout depuis la ligne de commande ou des scripts.
Dans cet article, nous allons explorer comment utiliser sed et awk pour lire, analyser et réécrire des fichiers de configuration de manière efficace. Nous passerons en revue des exemples pratiques qui peuvent aider à automatiser des tâches fastidieuses comme la mise à jour des adresses IP, le changement de paramètres ou l'extraction de valeurs.
Commençons par un exemple simple : remplacer un paramètre de configuration en utilisant sed.
Exemple 1 : Mettre à jour un paramètre avec la commande sed
Supposons que vous vouliez mettre à jour la directive ListenPort dans un fichier de configuration tel que /etc/ssh/sshd_config, vous pouvez le faire avec :
sed -i 's/^#\?ListenPort.*/ListenPort 2222/' /etc/ssh/sshd_config
Voici ce que cela fait :
-iindique àsedde modifier le fichier sur place.^#\?correspond aux lignes qui peuvent ou non commencer par un commentaire (#).ListenPort.*correspond au reste de la ligne, qu'il s'agisse de la valeur par défaut ou d'une valeur personnalisée.- La ligne entière est remplacée par
ListenPort 2222.
Cette approche confirme que même si la directive est commentée ou déjà définie sur une autre valeur, elle sera mise à jour correctement.
Exemple 2 : Extraire des valeurs avec la commande awk
Pour extraire des valeurs spécifiques d'un fichier de configuration, awk est un excellent choix. Par exemple, si vous souhaitez récupérer la valeur de la directive PermitRootLogin dans le fichier de configuration SSH, utilisez :
awk '$1 == "PermitRootLogin" { print $2 }' /etc/ssh/sshd_config
Voici ce que cela fait :
$1 == "PermitRootLogin"correspond aux lignes où le premier champ est exactementPermitRootLogin.{ print $2 }affiche le deuxième champ, qui est la valeur réelle attribuée à cette directive.
Cette commande analyse le fichier pour toute ligne commençant par PermitRootLogin et affiche la valeur correspondante, généralement yes, no ou prohibit-password.
Exemple 3 : Suppression d'une ligne de paramètre en utilisant la commande sed
Par exemple, si vous devez supprimer toute ligne qui commence par UseDNS dans le fichier /etc/ssh/sshd_config, vous pouvez le faire rapidement et efficacement en utilisant la commande sed.
sed -i '/^UseDNS/d' /etc/ssh/sshd_config
Ce que cela fait :
^UseDNScorrespond aux lignes qui commencent par UseDNS.- La commande
dindique àsedde supprimer ces lignes. - Le drapeau
-iapplique les modifications directement au fichier.
Cela est pratique lorsqu'une configuration obsolète ou indésirable est présente à plusieurs endroits, et que vous voulez qu'elle soit supprimée.
Exemple 4 : Génération d'un rapport avec la commande awk
Supposons que vous ayez un fichier de configuration personnalisé qui énumère les services avec leur statut, comme ceci :
apache2 running
mysql stopped
nginx running
ssh running
Vous pouvez utiliser awk pour générer rapidement un résumé de tous les services qui sont actuellement en cours d'exécution.
awk '$2 == "running" { print $1 }' /etc/myapp/services.conf
Voici ce que cela fait :
$2 == "running"correspond aux lignes où le deuxième champ est “running“.{ print $1 }affiche le nom du service.
Cela produit une liste uniquement des services qui sont actuellement en cours d'exécution. Vous pouvez développer cela en ajoutant des compteurs ou en enregistrant la sortie dans un fichier journal pour les scripts de surveillance.
Exemple 5 : Insérer une ligne avant ou après une correspondance en utilisant sed
Si vous avez besoin d'ajouter une nouvelle ligne après une directive spécifique dans un fichier de configuration, utilisez sed comme ceci :
sed -i '/^PermitRootLogin/a Banner /etc/issue.net' /etc/ssh/sshd_config
Voici ce que cela fait :
/^PermitRootLogin/correspond à la ligne contenantPermitRootLogin.aajoute la ligne après la correspondance.- La bannière
/etc/issue.netest la ligne qui est insérée.
C'est utile lorsque vous voulez garder les options de configuration liées regroupées de manière logique.
Bonus : Combiner awk et sed dans les scripts Shell
Les utilisateurs avancés peuvent même combiner awk et sed dans des scripts bash pour automatiser des tâches de configuration en masse. Par exemple, analyser tous les fichiers .conf dans un répertoire et réécrire un paramètre particulier dans chaque fichier — par exemple, mettre à jour une directive comme MaxConnections avec une nouvelle valeur.
Voici un script simple qui fait exactement cela :
#!/bin/bash
Define the new value for the parameter
NEW_VALUE=500
Loop through all .conf files in /etc/myapp/
for file in /etc/myapp/*.conf; do
# Check if the file contains the MaxConnections directive
if awk '$1 == "MaxConnections"' "$file" > /dev/null; then
# Use sed to replace the existing value
sed -i 's/^MaxConnections.*/MaxConnections '"$NEW_VALUE"'/' "$file"
echo "Updated MaxConnections in $file"
else
# If the directive doesn't exist, append it to the end
echo "MaxConnections $NEW_VALUE" >> "$file"
echo "Added MaxConnections to $file"
fi
done
Voici ce que fait ce script :
NEW_VALUEpour contenir la valeur mise à jour du paramètre.- Il parcourt chaque fichier
.confdans le répertoire/etc/myapp/. awkvérifie si la directiveMaxConnectionsexiste déjà.- S'il existe,
sedmet à jour la valeur sur place. - Sinon, la directive est ajoutée à la fin du fichier.
Ce type de script est incroyablement utile pour gérer de grands environnements où plusieurs fichiers de configuration nécessitent des mises à jour cohérentes sans avoir à éditer chacun manuellement.
En conclusion
Les deux, sed et awk, sont des outils indispensables pour les administrateurs Linux qui gèrent des systèmes à grande échelle. En les maîtrisant, vous pouvez éviter les modifications manuelles répétitives et garantir que vos changements de configuration sont fiables et reproductibles.