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 -q
switch, pero eso suprimiría la salida completa, que no quiero.
¿Cómo puedo hacer eso?
grep
no se deben imprimir los nombres de los archivos que no coinciden. En realidad, parece quegrep
considera que una línea con el contenido0
coincide. ¿Puedes publicar el patrón de búsqueda exacto que estás utilizando?grep 'delete' * -R
, pero no creo que-R
esté 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í ...grep -- 'delete' *
(agregué--
) y funcionó como se esperaba. Quitarlo--
está conduciendo a la pantalla anterior.-ci
. Gracias por resolver el problema. Puede publicar este escenario como respuesta.Respuestas:
Ese es el comportamiento exhibido por
grep -c
.Probablemente tenga un archivo cuyo nombre comience con
-
y contenga unc
carácter y esté utilizando GNU grep sin establecer laPOSIXLY_CORRECT
variable de entorno.Utilizar:
o mejor:
--
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 eldelete
argumento sin opción habría marcado el final de las opciones), pero no resolvería el problema de un archivo llamado-
. Elgrep 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).fuente
Añadir
No es muy elegante, pero creo que hará el trabajo.
Agregar
-l
a su comando le dará solo coincidencias, pero también suprimirá la impresión del número de coincidencias para cada archivo.fuente
-l
trabajó. la solución también es buena. Graciasgrep -v ':0$'
lo que sólo aquellos al final de una línea se emparejan (sin embargo, elgrep -l
enfoque es mucho mejor, siempre y cuando no es necesario el recuento de línea)Al
grep -l
usarlo 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
-c
que se usa para contar el número de coincidencias en un archivo.editar: Y como dijo Warlock, usar
-I
para suprimir coincidencias en archivos binarios también podría ser una buena idea.fuente
Cómo grep recuentos distintos de cero:
grep -rIcH 'string' . | grep -v ':0$'
-r
Subdirectorios recurrentes.-I
Ignorar archivos binarios (gracias @tongpu , warlock) .-c
Mostrar 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í).
fuente
Similar a la respuesta de Laurentiu, también puede usar la lista de
-l
entradas de archivo para grep:grep -r "pattern" -c $(grep -rl "pattern")
permite mantener el color de grep, pero hace lo mismo en segundo plano.
fuente