2009-05-19 9 views
11

necesario buscar una directorios con una gran cantidad de subdirectorios de una cadena dentro de archivos:Grep recursiva y el conde

que estoy usando:

grep -c -r "string here" * 

Como puedo recuento total de hallazgos?

¿Cómo puedo exportar para archivar solo aquellos archivos con al menos una instancia?

+0

¿Puede proporcionar más detalles sobre qué es exactamente lo que no funciona? ¿Cuál es el camino completo a grep y en qué sistema está ejecutando esto? – ennuikiller

+0

¿Puedes aclarar qué producto estás viendo y cómo lo que quieres es diferente de lo que obtienes? – Suppressingfire

Respuesta

9

Funciona para mí (se obtiene el número total de 'cadena aquí' que se encuentra en cada archivo). Sin embargo, no muestra el total de TODOS los archivos buscados. He aquí cómo usted puede conseguirlo:

grep -c -r 'string' file > out && \ 
    awk -F : '{total += $2} END { print "Total:", total }' out 

La lista estará en salir y el total será enviado a la salida estándar.

Aquí está la salida en el árbol de directorios Python2.5.4:

grep -c -r 'import' Python-2.5.4/ > out && \ 
    awk -F : '{total += $2} END { print "Total:", total }' out 
Total: 11500 

$ head out 
Python-2.5.4/Python/import.c:155 
Python-2.5.4/Python/thread.o:0 
Python-2.5.4/Python/pyarena.c:0 
Python-2.5.4/Python/getargs.c:0 
Python-2.5.4/Python/thread_solaris.h:0 
Python-2.5.4/Python/dup2.c:0 
Python-2.5.4/Python/getplatform.c:0 
Python-2.5.4/Python/frozenmain.c:0 
Python-2.5.4/Python/pyfpe.c:0 
Python-2.5.4/Python/getmtime.c:0 

Si lo que desea es obtener líneas con las ocurrencias de 'cadena', el cambio a esto:

grep -c -r 'import' Python-2.5.4/ | \ 
    awk -F : '{total += $2; print $1, $2} END { print "Total:", total }' 

que la voluntad salida:

[... snipped] 
Python-2.5.4/Lib/dis.py 4 
Python-2.5.4/Lib/mhlib.py 10 
Python-2.5.4/Lib/decimal.py 8 
Python-2.5.4/Lib/new.py 6 
Python-2.5.4/Lib/stringold.py 3 
Total: 11500 

puede cambiar la forma de impresión de los archivos ($ 1) y el conteo por archivo ($ 2).

+0

¿dónde está asignando la extensión de texto? – Codex73

+0

Disculpa, eso fue de una edición anterior. Las extensiones son tan triviales :-) –

+0

¿cómo puedo solo dar salida a archivos que tienen cadena? – Codex73

1

Probaría una combinación de find y grep.

find . | xargs grep -c "string here" 

De todos modos, grep -c -r "string here" * funciona para mí (Mac OS X).

+0

la cadena es muy grande, por lo que xargs no funciona – Codex73

+0

tenga cuidado con los espacios en los nombres de archivo. considere -print0 y -0 –

9

Usando la sustitución de procesos de Bash, ¿esto da lo que creo que es la salida que desea? (Por favor, aclarar la cuestión si no es.)

grep -r "string here" * | tee >(wc -l) 

Esto va en grep -r normalmente, con una producción que va tanto a la salida estándar ya un proceso wc -l.

0

Para activar solamente los nombres de archivo con partidos, utilice:

grep -r -l "your string here" . 

Se dará salida a una línea con el nombre de archivo para cada archivo que coincide con la expresión buscaba.

2

Algunos solución con AWK:

grep -r "string here" * | awk 'END { print NR } 1' 

siguiente es el recuento total, el número de archivos, y el número de resultados para cada uno, mostrando el primer partido de cada uno (para visualizar todos los partidos, cambiar la condición de ++f[$1]):

grep -r "string here" * | 
    awk -F: 'END { print "\nmatches: ", NR, "files: ", length(f); 
        for (i in f) print i, f[i] } !f[$1]++' 

de salida para la primera solución (la búsqueda dentro de un directorio para "boost::".Corté manualmente algunas líneas demasiado largas para que quepan horizontalmente):

list_inserter.hpp:   return range(boost::begin(r), boost::end(r)); 
list_of.hpp:   ::boost::is_array<T>, 
list_of.hpp:   ::boost::decay<const T>, 
list_of.hpp:   ::boost::decay<T> >::type type; 
list_of.hpp:  return ::boost::iterator_range_detail::equal(l, r); 
list_of.hpp:  return ::boost::iterator_range_detail::less_than(l, r); 
list_of.hpp:  return ::boost::iterator_range_detail::less_than(l, r); 
list_of.hpp:  return Os << ::boost::make_iterator_range(r.begin(), r.end()); 
list_of.hpp:   return range(boost::begin(r), boost::end(r)); 
list_of.hpp:   return range(boost::begin(r), boost::end(r)); 
list_of.hpp:   return range(boost::begin(r), boost::end(r)); 
ptr_list_of.hpp:       BOOST_DEDUCED_TYPENAME boost::ptr_... 
ptr_list_of.hpp:  typedef boost::ptr_vector<T>  impl_type; 
13 

de salida para el segundo

list_inserter.hpp:   return range(boost::begin(r), boost::end(r)); 
list_of.hpp:   ::boost::is_array<T>, 
ptr_list_of.hpp:       BOOST_DEDUCED_TYPENAME boost::ptr_... 

matches: 13 files: 3 
ptr_list_of.hpp 2 
list_of.hpp 10 
list_inserter.hpp 1 

Colores en el resultado son agradables (--color=always para grep), pero se rompen cuando se canaliza a través awk aquí. Así que mejor no los habilites entonces a menos que quieras tener todo tu terminal de color después :) ¡Saludos!

1
grep -rc "my string" ./ | grep :[1-9] >> file_name_by_count.txt 

Funciona como un encanto.