Barra de progreso de Grep usando pv (visor de tuberías)

11

Tengo un gran directorio en mi computadora y necesito buscar una cadena en cada archivo de ruby.

Podría haberlo hecho así: grep -R "string" *.rbpero lleva mucho tiempo y me gustaría usar pv (visor de tuberías) para mostrar una barra de progreso para poder monitorear el grepprogreso.

Pero realmente no sé cómo puedo escribir este comando porque todavía hay algunas cosas que no puedo entender sobre este comando.

¿Alguien tiene alguna idea?

Cydonia7
fuente

Respuestas:

15

pvopera en tuberías (no comandos): es un medidor de volumen que muestra la cantidad de datos que ha pasado un punto dado en la tubería.
Su comando grep es no una tubería ( |- la pipe operatores por ningún lado) - es sólo un único comando haciendo su cosa. pvNo puedo ayudarte aquí, solo tienes que confiar en que greprealmente está haciendo lo suyo en todos los archivos de entrada.

Usted podría improvisar algo juntos con el hallazgo, PV, y xargs grep ( find . -name "*.rb" | pv | xargs grep [regex]parece que podría ser prometedor, pero que tendría que decirle pvlo grande que la findsalida es para que dé resultados significativos.

Francamente, parece más trabajo de lo que vale. Simplemente ejecute su grep, espere pacientemente y maneje la salida cuando haya terminado.

voretaq7
fuente
1
Es definitivamente posible , sólo es complicado y probablemente necesitará más tiempo para armar y ponerse a trabajar de esperar a que el grep a fin :-)
voretaq7
1
Podría ser un fragmento realmente agradable: p
Cydonia7
4

Dos métodos más:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

O, en un shell diferente mientras se ejecuta su comando original, busque el pid del comando grep y luego:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Ambos de los anteriores le mostrarán en qué archivo está trabajando actualmente el comando grep. Puede encontrar el número total de archivos con:

ls -l *.rb | wc -l

Por último, use esto para averiguar qué número está el archivo actual en la lista:

ls -l *.rb | grep -n [the current filename]

PD: Mis respuestas suponen que todos sus archivos están en un solo directorio. Si no lo están, deberá usarlo en findlugar de lsy *.rbcomo sugiere thinice.

Ladadadada
fuente
1
Esa es una buena alternativa
Cydonia7
1

No estoy seguro de qué sistema operativo está utilizando, pero es grep -R "string" *.extposible que no funcione correctamente para usted.

Puede ser mejor que lo use findjunto con grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"

hielo delgado
fuente
Correcto, el comando que he dado realmente funciona en Fedora 16 pero el tuyo es más claro. Gracias !
Cydonia7
1

En versiones recientes de pvhay una "-d"opción para ver todos los FD de otro proceso.

Entonces, en teoría pv, no solo funcionará como una tubería, sino también como un indicador de progreso para todo un proceso. (Por ejemplo, pruébelo con el PID de su Firefox)

Para el problema anterior, una idea más simple es la siguiente: mientras grepse ejecuta, use lsofjunto con watch.

$ watch -n 1 "lsof | grep -n $PWD"

De esa manera puedes monitorear el progreso de tu grep.

Jan Walzer
fuente
0

¿Ya lo intentaste?

grep -R "string" *.rb | pv

No sé si realmente funciona porque no sabe cuántos bits de datos totales buscar porque es recursivo.

nhutto
fuente
44
No creo que esto haga lo que quiere: pvestará operando en la salida del grep (por lo que incluso si especificó el tamaño de entrada completo pvsolo ve que la salida sale del final de la tubería, estaría muy por debajo -contar bytes.
voretaq7
0

Usualmente uso el sistema de archivos proc en sistemas Linux, es decir

ls -al /proc/<pid of grep>/fd

Esto enumera todos los archivos que la invocación grep ha abierto actualmente y, por lo tanto, da una idea de en qué parte de la búsqueda se encuentra actualmente.

centic
fuente