Comment grep des lignes qui ne commencent pas par “#” ou “;”?

78

Je veux grep smb.confet ne voir que les lignes qui ne sont pas commentées.

Denys
la source
1
testparmmieux le faire car cela affiche aussi les valeurs par défaut.
F. Hauri
@ F.Hauri Merci. cela fonctionne aussi bien. Mais il s'agit également de produire des informations inutiles (dans mon cas), qui devraient également être récupérées ...
denys
Une autre manière de passer par PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Réponses:

125
grep "^[^#;]" smb.conf

Le premier ^fait référence au début de la ligne, donc les lignes avec des commentaires commençant après le premier caractère ne seront pas exclues. [^#;]signifie tout caractère qui n'est pas #ou ;.

En d'autres termes, il signale les lignes qui commencent par tout caractère autre que #et ;. Ce n'est pas la même chose que de rapporter les lignes qui ne commencent pas par ( #et ;pour lesquelles vous utiliseriez grep -v '^[#;]'), cela exclut également les lignes vides , mais c'est probablement préférable dans ce cas car je doute que vous vous préoccupiez des lignes vides.

Si vous voulez ignorer les caractères vierges, vous pouvez le changer en:

grep '^[[:blank:]]*[^[:blank:]#;]' smb.conf

ou

grep -vxE '[[:blank:]]*([#;].*)?' smb.conf

Ou

awk '$1 ~ /^[^;#]/' smb.conf
boucle d'or
la source
La bonne réponse est: cat /etc/samba/smb.conf | grep ^[^#\;]mais de toute façon merci
denys
Ouais, ou vous pouvez utiliser "guillemets"; Je l'ai édité par la suite.
goldilocks
7
@denys Vous avez tort: ​​la réponse de goldilocks n’est pas pire que la vôtre. .1 Veuillez éviter d'utiliser la cat ...| syntaxe !. .2 Pour fouetter les lignes vides ET les lignes ne contenant que des espaces, peut-être avec des commentaires, vous pourriez utiliser ceci:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri
7
@ EmmanuelBerg C'est une fourchette inutile. cat file | grep "blah"Cela implique d'exécuter deux fichiers binaires via un fifo , tout en faisant grep "blah" <fileexactement la même chose et en se liant file naturellement à grep STDIN. [bash] chat inutile est un sujet de recherche complet, quel que soit le moteur de recherche utilisé! -> blog.sanctum.geek.nz/useless-use-of-cat ... for sample
F. Hauri
2
Cela ne fait pas exactement la même chose . Il crée 2 processus et un tuyau où 1 processus suffit. Lisez le lien donné dans le dernier commentaire de @ F.Hauri.
Rahmu
4

Solution Vim:

:v/^\s*[#\n]/p

Je suis tombé sur cette question en essayant de trouver la solution vim moi-même.

David Lord
la source
1
Cela supprime également les lignes commençant par des blancs.
Kusalananda
Vrai. J'ai trouvé cela utile pour les fichiers de configuration car des lignes entre les commentaires remplissaient sinon le résultat. Si vous préférez garder les lignes blanches, changer *à +comme ceci:v/^\s+[#\n]/p
David Lord
3

Le tuyau vers grep dans la réponse de oliver nadj peut être éliminé par (en supposant que GNU grepou compatible):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Morten Lind
la source
Deuxième grep i @ nadj semble inutile, la réponse de @ goldilocks était plus que tout.
Archemar
1
Je conviens que la réponse de goldilocks était correcte. Cependant, j'ai aussi jugé utile de ne pas afficher les lignes vides.
Morten Lind
2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

c'est ce qui fonctionne pour moi. ignorer les lignes commentées ou vides, même les espaces avant le signe dièse ou le point-virgule

Oliver Nadj
la source
2

Ces exemples pourraient être utiles aux gens.

[user@host tmp]$ cat whitespacetest
# Line 1 is a comment with hash symbol as first char

# Line 2 is a comment with hash symbol as second char
  # Line 3 is a comment with hash symbol as third char
        # Line 4 is a comment with tab first, then hash
        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

Le premier exemple grep exclut les lignes commençant par une quantité quelconque d'espaces, suivie d'un symbole de hachage.

[user@host tmp]$ grep -v '^[[:space:]]*#' whitespacetest

        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

La seconde exclut les lignes commençant par un espace quelconque suivi d'un symbole de hachage ou d'un point-virgule.

[user@host tmp]$ grep -v '^[[:space:]]*[#;]' whitespacetest

[user@host tmp]$
JungleMartin
la source
0

Ici, j'en ai un meilleur (en supposant que GNU grepou compatible):

grep -v '^[#;/%<]\|^\s*$' anyfile.conf

exclure pour les lignes commençant par #;/%<des crochets et le deuxième filtre après le tuyau \s*$pour les lignes vierges.

S. Venkata Ramana
la source
2
Dans quel type de fichiers de conf sont <ou sont /utilisés pour les commentaires? Je connais beaucoup de formats de fichiers de conf où <est tout sauf un commentaire. !est parfois utilisé comme dans les fichiers de ressources X.
Stéphane Chazelas
-2
egrep -v "^#|^$" anyfile.txt

cette commande consiste à grep toutes les informations du fichier à l’exclusion des commentaires et des lignes vides.

Mustafa Hussein
la source
2
Notez que smb.conf commente également avec;
Jeff Schaller
-3

Cela devrait vous afficher le fichier sans ces lignes qui commencent par #: grep -v "^#" filename

Avinasha
la source
Cela ne fait rien aux lignes commençant par ;.
Kusalananda