Barra di avanzamento grep usando pv (pipe viewer)


11

Ho una grande directory sul mio computer e ho bisogno di cercare una stringa in ogni file ruby ​​all'interno.

Avrei potuto farlo in questo modo: grep -R "string" *.rbma ci vuole molto tempo e mi piacerebbe usare pv (pipe viewer) per mostrare una barra di avanzamento per poter monitorare i grepprogressi.

Ma non so davvero come posso scrivere questo comando perché ci sono ancora alcune cose che non riesco proprio a capire su questo comando.

Qualcuno ha qualche idea?

Risposte:


15

pvfunziona su pipe (non comandi) - È un indicatore di volume che mostra quanti dati sono passati oltre un determinato punto della pipeline.
Il tuo comando grep non è una pipeline ( |- pipe operatornon si trova da nessuna parte) - è solo un singolo comando che fa la sua cosa. pvnon posso aiutarti qui, devi solo fidarti che in greprealtà sta facendo la sua cosa su tutti i file di input.

Potresti mettere insieme qualcosa con find, pv, xargs e grep ( find . -name "*.rb" | pv | xargs grep [regex]sembra che potrebbe essere promettente, ma dovresti dire pvquanto è grande l' findoutput per dare risultati significativi.

Francamente sembra più lavoro di quanto valga la pena. Esegui il grep, attendi pazientemente e gestisci l'output al termine.


1
È sicuramente possibile , è solo contorto e probabilmente impiegherà più tempo a mettere insieme e mettersi al lavoro piuttosto che aspettare che il grep finisca :-)
voretaq7

1
Potrebbe essere uno snippet davvero bello: p
Cydonia7,

4

Altri due metodi:

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

Oppure, in una shell diversa mentre il comando originale è in esecuzione, trova il pid del comando grep e quindi:

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

Entrambi i precedenti ti mostreranno su quale file sta attualmente lavorando il comando grep. Puoi trovare il numero totale di file con:

ls -l *.rb | wc -l

Infine, usa questo per capire quale numero è il file corrente nell'elenco:

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

PS Le mie risposte presuppongono che tutti i tuoi file siano in una singola directory. In caso contrario, dovrai usare al findposto di lse *.rbcome suggerito thinice.


1
È una bella alternativa
Cydonia7 del

1

Non sono sicuro del sistema operativo in uso, ma grep -R "string" *.extpotrebbe non funzionare correttamente per te.

Potresti essere meglio servito usando findinsieme a grep:

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


Bene, il comando che ho dato in realtà funziona su Fedora 16 ma il tuo è più chiaro. Grazie !
Cydonia7,

1

Nelle versioni recenti di pvc'è "-d"un'opzione per guardare tutti gli FD di un altro processo.

Quindi, in teoria, pvfunzionerà non solo come pipe ma anche come indicatore di progresso per un intero processo. (Ad esempio, provalo con il PID di Firefox)

Per il problema sopra, un'idea più semplice è la seguente: Mentre grepè in esecuzione, utilizzare lsofinsieme a watch.

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

In questo modo puoi monitorare l'avanzamento del tuo grep.


0

Hai già provato

grep -R "string" *.rb | pv

Non so se funziona davvero perché non sa quanti bit di dati totali cercare perché è ricorsivo?


4
Non penso che questo farà quello che vuole - pvopererà sull'output del grep (quindi anche se ha specificato la dimensione di input completa pvvede solo l'output che esce dalla fine del pipe - Sarebbe molto sotto -counting byte.
voretaq7

0

Di solito uso il filesystem proc su sistemi Linux, ad es

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

Questo elenca tutti i file che attualmente grep-invocation ha aperto e dà quindi l'impressione di dove sia attualmente nella ricerca.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.