web-dev-qa-db-fra.com

Comment grep les lignes qui ne commencent pas par "#" ou ";"?

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

83
denys
grep "^[^#;]" smb.conf

La première ^ 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 commençant par n'importe quel caractère autre que # et ;. Ce n'est pas la même chose que de signaler les lignes qui ne commencent pas par # et ; (pour lequel vous utiliseriez grep -v '^[#;]') en ce qu'il exclut également les lignes vides, mais c'est probablement préférable dans ce cas car je doute que vous vous souciez des lignes vides.

Si vous souhaitez ignorer les premiers caractères vides, vous pouvez le remplacer par:

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

ou

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

Ou

awk '$1 ~ /^[^;#]/' smb.conf
140
goldilocks

Solution Vim:

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

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

4
David Lord

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 n'importe quelle quantité d'espace blanc suivi 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 n'importe quel espace, suivies d'un symbole de hachage ou d'un point-virgule.

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

[user@Host tmp]$
3
JungleMartin

Le canal vers grep dans la réponse d'Oliver Nadj peut être éliminé par (en supposant GNU grep ou compatible):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
3
Morten Lind
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 la marque de hachage ou le point-virgule

2
oliver nadj

Ici, je suis meilleur (en supposant GNU grep ou compatible):

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

exclure pour les lignes commençant par #;/%< qui sont entre crochets et le deuxième filtre après le tuyau est \s*$ pour les lignes vides.

0
S. Venkata Ramana
grep -v '^$\|^\s*#' temp

Celui-ci est beaucoup mieux, je l'ai obtenu de https://stackoverflow.com/questions/17392869/how-to-print-a-file-excluding-comments-and-blank-lines-using-grep- sed

Cela suppose GNU grep ou compatible.

0
Tek