Bash - Afficher un fichier sans les lignes de commentaires

baissaoui Messages postés 498 Date d'inscription jeudi 2 septembre 2021 Statut Webmaster Dernière intervention 21 août 2024 - 21 juin 2022 à 13:09
Document initial créé par Jipicy

Il est parfois utile d'afficher un fichier sans pour autant afficher la myriade de lignes de commentaire l'accompagnant (en particulier pour les fichiers de configuration de notre OS préféré ;-) ), ainsi qu'en le délestant de ses lignes vides.

Voilà trois façons de procéder.

Grep

La 1ère à l'aide de "egrep" (ou "grep -E"):
egrep -v '^(#|$)'  /etc/samba/smb.conf

grep -E -v '^(#|$)' /etc/samba/smb.conf
Là l'exemple se contente de ne pas afficher toutes lignes commençant par un dièse (#) ou par le caractère de contrôle de fin de ligne dollar ($).

S'il s'avérait que le délimiteur de commentaires soit placé non pas en début de ligne mais en retrait (espace ou tabulation), ou que le fichier mêle d'autres caractères délimiteurs comme le point virgule (;), rien ne vous empêche d'embellir votre expression rationnelle comme suit :
grep -E -v '^(#|;|$|[ ]*#)' /etc/samba/smb.conf

Sed

La seconde à l'aide de "sed" :
sed -e '/^[ ]*#/d' -e '/^$/d' /etc/samba/smb.conf
On élimine en premier les lignes commençants par un espace ou un signe dièse, puis on élimine toutes les lignes vides.

Bien entendu comme dans l'exemple précédent vous pouvez étoffer votre commande en incluant d'autres motifs, comme le point virgule, ce qui donnerait :
sed -e '/^[ ]*#/d' -e '/^[ ]*;/d' -e '/^$/d' /etc/samba/smb.conf

Perl

La troisième à l'aide de "perl" :

En fait il s'agit toujours des regex, c'est l'utilitaire qui change.
Qu'il s'agisse de grep, egrep, sed, python, perl, etc. c'est toujours la regex qui fait l'affaire.
Il nous reste seulement à étudier l'implémentation des regex et le moteur utilisé par les utilitaires.
A savoir par exemple qu'un moteur DFA - Deterministic Finite Automation - est plus rapide qu'un moteur NFA - Nondeterministic Finite Automation - .
En revanche le moteur NFA nous permet de mieux peaufiner et diriger la regex pour obtenir le résultat voulu, donc un environement de créativité qu'on ne trouve pas avec un moteur DFA.
perl -ne 'print unless /^\s*[;\$#]|^$/' fichier_config

Les commandes sed et grep utilisent la syntaxe des expressions régulières. Vous pourrez trouver des compléments d'information pour vous familiariser avec cette notion à cette adresse :
phpreg