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?

grepno se deben imprimir los nombres de los archivos que no coinciden. En realidad, parece quegrepconsidera que una línea con el contenido0coincide. ¿Puedes publicar el patrón de búsqueda exacto que estás utilizando?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í ...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 unccarácter y esté utilizando GNU grep sin establecer laPOSIXLY_CORRECTvariable 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 eldeleteargumento 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
-la su comando le dará solo coincidencias, pero también suprimirá la impresión del número de coincidencias para cada archivo.fuente
-ltrabajó. 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 -lenfoque es mucho mejor, siempre y cuando no es necesario el recuento de línea)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.fuente
Cómo grep recuentos distintos de cero:
grep -rIcH 'string' . | grep -v ':0$'-rSubdirectorios recurrentes.-IIgnorar archivos binarios (gracias @tongpu , warlock) .-cMostrar recuento de partidos. Molesto, incluye archivos de 0 recuentos.-HMostrar 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
-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.
fuente