Como grep linhas que não começam com "#" ou ";"?

78

Eu quero grep smb.confe ver apenas as linhas que não são comentadas.

nega
fonte
1
testparmfaça isso melhor, pois também exibe os valores padrão.
11773 F. Hauri
@ F.Hauri Obrigado. está funcionando também. Mas também produz algumas informações desnecessárias (no meu caso), que também devem ser recebidas ...
denys
superset: qualquer regex: superuser.com/questions/655715/regex-does-not-begin-by-pattern
Ciro Santilli新疆改造中心法轮功六四事件
Outra maneira através do PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Respostas:

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

O primeiro ^se refere ao início da linha, portanto, as linhas com comentários iniciados após o primeiro caractere não serão excluídas. [^#;]significa qualquer caractere que não seja #ou ;.

Em outras palavras, ele relata linhas que começam com qualquer caractere que não seja #e ;. Não é o mesmo que relatar as linhas que não começam #e ;(para as quais você usaria grep -v '^[#;]'), pois também exclui as linhas vazias , mas provavelmente é preferível nesse caso, pois duvido que você se importe com as linhas vazias.

Se você quiser ignorar os principais caracteres em branco, poderá alterá-lo para:

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

ou

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

Ou

awk '$1 ~ /^[^;#]/' smb.conf
Cachinhos Dourados
fonte
a resposta certa é: cat /etc/samba/smb.conf | grep ^[^#\;]Mas de qualquer maneira Obrigado
denys
Sim, ou você pode usar "aspas"; Eu editei isso posteriormente.
Goldilocks
7
@denys Você está errado: a resposta de goldilocks não é pior que a sua. .1 Evite usar a cat ...| sintaxe !. .2 Para chicotear linhas vazias E linhas contendo apenas espaço, talvez com os comentários que U possa usar:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri
7
@EmanuelBerg É um garfo inútil. cat file | grep "blah"implie a execução de dois binários através de um fifo , enquanto grep "blah" <filefaz exatamente o mesmo e vincula file naturalmente ao grep STDIN. [bash] gato inútil é um assunto completo de pesquisa em qualquer mecanismo de pesquisa! -> blog.sanctum.geek.nz/useless-use-of-cat ... para amostra #
F. Hauri
2
Não faz exatamente o mesmo . Cria 2 processos e um canal onde 1 processo é suficiente. Leia o link fornecido no último comentário de @ F.Hauri.
rahmu
4

Solução Vim:

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

Eu me deparei com essa pergunta ao tentar encontrar a solução vim.

David Lord
fonte
1
Isso também excluiria linhas que começam com espaços em branco.
Kusalananda
Verdadeiro. Achei isso útil para arquivos de configuração, pois as linhas entre os comentários preenchem a saída. Se preferir manter as linhas em branco, altere *para +o seguinte:v/^\s+[#\n]/p
David Lord
3

O canal para grep na resposta de oliver nadj pode ser eliminado por (assumindo o GNU grepou compatível):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Morten Lind
fonte
Segundo grep i @ nadj parece inútil, a resposta de @ goldilocks foi mais do que suficiente.
Archemar 13/10/2015
1
Concordo que a resposta de goldilocks estava correta. No entanto, também considerei útil não mostrar linhas vazias.
Morten Lind
2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

é isso que funciona para mim. ignore as linhas comentadas ou vazias, mesmo espaços em branco antes da marca de hash ou ponto-e-vírgula

oliver nadj
fonte
2

Esses exemplos podem ser úteis para as pessoas.

[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]$

O primeiro exemplo de grep exclui linhas que começam com qualquer quantidade de espaço em branco seguido por um símbolo de hash.

[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]$

O segundo exclui linhas que começam com qualquer quantidade de espaço em branco seguido por um símbolo de hash ou ponto e vírgula.

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

[user@host tmp]$
JungleMartin
fonte
0

Aqui eu tenho um melhor (assumindo GNU grepou compatível):

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

exclua para as linhas que começam com #;/%<colchetes e o segundo filtro após o tubo é \s*$para linhas em branco.

S. Venkata Ramana
fonte
2
Em que tipo de arquivos conf são <ou /usados ​​para comentários? Conheço muitos formatos de arquivo conf, onde <há tudo, menos um comentário. !às vezes é usado como nos arquivos de recursos X.
Stéphane Chazelas
-2
egrep -v "^#|^$" anyfile.txt

este comando é grep todas as informações no arquivo, excluindo comentários e linhas em branco.

Mustafa Hussein
fonte
2
Observe que o smb.conf também comenta com;
Jeff Schaller
-3

Isso deve exibir o arquivo sem as linhas que começam com #: grep -v "^#" filename

Avinasha
fonte
Isso não faz nada para as linhas que começam com ;.
Kusalananda