¿Cómo grep líneas que no comienzan con "#" o ";"?

78

Quiero grep smb.confy ver solo líneas que no están comentadas.

denys
fuente
1
testparmhacerlo mejor ya que también muestra valores predeterminados.
F. Hauri
@ F.Hauri Gracias. Funciona también. Pero también produce información innecesaria (en mi caso), que también debería ser asimilada ...
niega el
superconjunto: cualquier expresión regular: superuser.com/questions/655715/regex-does-not-begin-by-pattern
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Otra forma a través de PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Respuestas:

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

El primero se ^refiere al comienzo de la línea, por lo que no se excluirán las líneas con comentarios que comiencen después del primer carácter. [^#;]significa cualquier carácter que no sea #o ;.

En otras palabras, informa líneas que comienzan con cualquier carácter que no sea #y ;. No es lo mismo que informar las líneas que no comienzan #y ;(para las que usaría grep -v '^[#;]'), ya que también excluye las líneas vacías , pero eso es probablemente preferible en este caso, ya que dudo que le interesen las líneas vacías.

Si desea ignorar los caracteres en blanco iniciales, puede cambiarlo a:

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

o

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

O

awk '$1 ~ /^[^;#]/' smb.conf
encerrada dorada
fuente
la respuesta correcta es: cat /etc/samba/smb.conf | grep ^[^#\;]Pero de todos modos, gracias
denys
Sí, o podrías usar "comillas"; Lo edité posteriormente.
Ricitos de oro
77
@denys Estás equivocado: la respuesta de Ricitos de Oro no es peor que la tuya. .1 ¡Evite usar la cat ...| sintaxis !. .2 Para batir líneas vacías Y líneas que contienen solo espacio, tal vez con comentarios U podría usar esto:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri
77
@EmanuelBerg Es un tenedor inútil. cat file | grep "blah"implica ejecutar dos binarios a través de un quince , mientras que grep "blah" <filehace exactamente lo mismo y se une file naturalmente a grep's STDIN. [bash] gato inútil es un tema de búsqueda con todas las funciones a través de cualquier motor de búsqueda! -> blog.sanctum.geek.nz/useless-use-of-cat ... para muestra
F. Hauri
2
No hace exactamente lo mismo . Crea 2 procesos y una tubería donde 1 proceso es suficiente. Lea el enlace dado en el último comentario de @ F.Hauri.
rahmu
4

Solución Vim:

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

Me encontré con esta pregunta al intentar encontrar la solución vim yo mismo.

David Lord
fuente
1
Esto también eliminaría las líneas que comienzan con espacios en blanco.
Kusalananda
Cierto. Me pareció útil para los archivos de configuración, ya que las líneas entre comentarios llenan el resultado. Si prefieres mantener las líneas en blanco, cambia el me gusta *para +que así:v/^\s+[#\n]/p
David Lord,
3

La tubería para grep en la respuesta de oliver nadj puede eliminarse (suponiendo GNU grepo compatible):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Morten Lind
fuente
En segundo lugar, grep i @ nadj parece inútil, la respuesta de @ goldilocks fue más que suficiente.
Archemar
1
Estoy de acuerdo en que la respuesta de Ricitos de Oro fue correcta. Sin embargo, también consideré útil no mostrar líneas vacías.
Morten Lind el
2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

Eso es lo que funciona para mí. ignore las líneas comentadas o vacías, incluso los espacios en blanco antes de la marca de punto o el punto y coma

oliver nadj
fuente
2

Estos ejemplos pueden ser útiles para las personas.

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

El primer ejemplo grep excluye líneas que comienzan con cualquier cantidad de espacio en blanco seguido de un símbolo 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]$

El segundo excluye las líneas que comienzan con cualquier cantidad de espacio en blanco seguido de un símbolo hash o punto y coma.

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

[user@host tmp]$
SelvaMartin
fuente
0

Aquí obtuve una mejor (suponiendo GNU grepo compatible):

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

excluya las líneas que comienzan con #;/%<corchetes y el segundo filtro después de la tubería es \s*$para líneas en blanco.

S. Venkata Ramana
fuente
2
¿En qué tipo de archivos conf se usan <o se /usan para comentarios? Conozco muchos formatos de archivos conf donde <hay de todo menos un comentario. !a veces se usa como en los archivos de recursos X.
Stéphane Chazelas
-2
egrep -v "^#|^$" anyfile.txt

Este comando es grep toda la información en el archivo, excepto los comentarios y las líneas en blanco.

Mustafa Hussein
fuente
2
Tenga en cuenta que smb.conf también comenta con;
Jeff Schaller
-3

Esto debería mostrar el archivo sin esas líneas que comienzan con #: grep -v "^#" filename

Avinasha
fuente
Esto no hace nada a las líneas que comienzan con ;.
Kusalananda