grep cómo suprimir la visualización de archivos no coincidentes?

11

Estoy tratando de encontrar archivos que contengan una palabra específica usando grep. Hay muchos archivos en el directorio (> 500)

Comando corro

$ grep 'delete' *

Salida

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Estos son los archivos que no contienen la coincidencia dada. Quiero evitar que esas líneas se muestren en stdout. Sé de -qswitch, pero eso suprimiría la salida completa, que no quiero.

¿Cómo puedo hacer eso?

mtk
fuente
2
Normalmente, grepno se deben imprimir los nombres de los archivos que no coinciden. En realidad, parece que grepconsidera que una línea con el contenido 0coincide. ¿Puedes publicar el patrón de búsqueda exacto que estás utilizando?
Adrian Heine
El cmd grep completo que utilicé fue grep 'delete' * -R, pero no creo que -Resté causando ningún problema. Y sí, lo que normalmente no imprime las no coincidentes, pero no está seguro de lo que es el caso aquí ...
MTK
@step @everyone .. Extraño ... Después de ver la publicación editada arriba. Lo intenté grep -- 'delete' *(agregué --) y funcionó como se esperaba. Quitarlo --está conduciendo a la pantalla anterior.
mtk
1
@Stephane De hecho, tienes razón. Busqué en el directorio ... y había un archivo con nombre -ci. Gracias por resolver el problema. Puede publicar este escenario como respuesta.
mtk

Respuestas:

9

Ese es el comportamiento exhibido por grep -c.

Probablemente tenga un archivo cuyo nombre comience con -y contenga un ccarácter y esté utilizando GNU grep sin establecer la POSIXLY_CORRECTvariable de entorno.

Utilizar:

grep -- delete *

o mejor:

grep delete ./*

--marca el final de las opciones para que ese nombre de archivo no se considere como una opción (con un POSIX grep, no lo haría ya que el deleteargumento sin opción habría marcado el final de las opciones), pero no resolvería el problema de un archivo llamado -. El grep delete ./*es más robusto, pero tiene el inconveniente de dar salida a la adicional ./para los archivos que coinciden (aunque eso puede ser considerada como una ventaja ya que ayuda a identificar los nombres de archivo que contienen caracteres de nueva línea).

Stéphane Chazelas
fuente
12

Añadir

| grep -v ':0$'

No es muy elegante, pero creo que hará el trabajo.

Agregar -la su comando le dará solo coincidencias, pero también suprimirá la impresión del número de coincidencias para cada archivo.

Laurentiu Roescu
fuente
1
-ltrabajó. la solución también es buena. Gracias
mtk
44
la línea grep debe ser grep -v ':0$'lo que sólo aquellos al final de una línea se emparejan (sin embargo, el grep -lenfoque es mucho mejor, siempre y cuando no es necesario el recuento de línea)
mreithub
9

Al grep -lusarlo solo obtendrá los archivos que contienen al menos una coincidencia.

¿Necesita información sobre cuántas coincidencias hay en un archivo? Porque puede omitir el uso -cque se usa para contar el número de coincidencias en un archivo.

editar: Y como dijo Warlock, usar -Ipara suprimir coincidencias en archivos binarios también podría ser una buena idea.

tongpu
fuente
0

Cómo grep recuentos distintos de cero:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Subdirectorios recurrentes.
  • -IIgnorar archivos binarios (gracias @tongpu , warlock) .
  • -cMostrar recuento de partidos. Molesto, incluye archivos de 0 recuentos.
  • -H Mostrar nombre de archivo, incluso si solo hay un archivo.
  • 'string' Tu cuerda va aquí.
  • . Comience desde el directorio actual.
  • | -v ':0$'Eliminar archivos de 0 recuentos. (gracias @LaurentiuRoescu )

(Me doy cuenta de que el OP estaba contando involuntariamente -c, pero google (grep non-zero count) aterriza aquí).

Bob Stein
fuente
0

Similar a la respuesta de Laurentiu, también puede usar la lista de -lentradas de archivo para grep:
grep -r "pattern" -c $(grep -rl "pattern")
permite mantener el color de grep, pero hace lo mismo en segundo plano.

adriel
fuente
tenga en cuenta que los nombres de archivos y directorios que contienen espacios en blanco o comodines se dividirán y combinarán por error como resultado.
Jeff Schaller