Búsqueda de cadenas: encontrar y grep y?


1

Tarea:
1) encontrar una cadena 'decor' dentro de los archivos en un directorio
2) obtener el número de ocurrencias para la decoración de cada archivo que lo tenga

La primera parte del problema se resuelve parcialmente con find . -type f | grep -i decor *
Pero esto no parece grep para todos los archivos que se encuentran desde find sino más bien lo que está encima del directorio actual.
¿Tengo que usar algo que no sea * para grep grep para archivos encontrados desde encontrar?

¿Qué se debe canalizar para que se muestre con un nombre de archivo y la cantidad de incidencias para la decoración de cada archivo?

Respuestas:


2

Tu puedes hacer:

find . -type f -exec grep -icH decor {} \; | grep -v :0\$

Esto obtendrá el nombre de archivo y el recuento de cada coincidencia y eliminará los archivos con un recuento de 0 utilizando el egrep canalizado


¡No hay problema! Sin embargo, tenga en cuenta la edición, sin los dos puntos, ignorará cualquier número que termine en 0, por lo que 10, 100, etc.
arco444

Solo por el gusto de hacerlo, y mucho más allá del alcance de este ejercicio, emití un find2perl . -type f -exec grep -icH {} \; para ver si estoy dispuesto a agregar el grep -v: 0 \ $ parte. Parece factible, tal vez más tarde durante Jeopardy.
Billy McCloskey

2

"Archivos en un directorio" no suele significar "y los subdirectorios iside recursivamente". Yo solo usaría

grep -c decor *

Si también necesita buscar subdirectorios, puede usar buscar, pero conectar los comandos de forma diferente: la tubería simplemente conecta la salida del primer comando a la entrada del segundo. Sin embargo, Grep no espera una lista de archivos en su entrada.

find . -type f -exec grep -cH decor {} + | grep -v :0

0

Puede utilizar la opción -exec. find . -type f -exec grep decor {} \;

o usa xargs find . -type f | xargs -i grep decor {}


-1: i) esto rompe los nombres de archivo con espacios en blanco y ii) ninguna de las soluciones devuelve el número de coincidencias decor que es lo que pidió el OP.
terdon

0

TMTOWTDI - Me gusta ver las otras variantes, así que aquí está la mía también:

$ find . -type f -exec egrep -li decor {} \;

$ perl -e '$c=0; while(<>){$c++ if /decor/;} continue {if(eof){print("$ARGV:$c\n"); close ARGV; $c=0;} }' *

Solo porque sentí ganas de volver a escribir un Perl 1-liner que funciona igual que un viejo awk ejemplo tomado de las páginas de Kernighan y Pike .


TMTOWTDI - Suena como algo que vale la pena hacer. Nota la perl2find sugerencia no tan útil , arriba - sólo por diversión. Ya has resuelto mi respuesta, con la misma referencia. ¡Bravo!
Billy McCloskey

BTW - Eso while (& lt; & gt;) {} continuar {if (eof) {close ARGV;} El lenguaje vale la pena memorizar. Una vez más, ese lenguaje Perl es digno de memorización.
Billy McCloskey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.