Barra de progresso do Grep usando pv (visualizador de tubos)

10

Eu tenho um diretório enorme no meu computador e preciso procurar em cada arquivo ruby dentro de uma string.

Eu poderia ter feito assim: grep -R "string" *.rb , mas demora muito e gostaria de usar o pv (visualizador de canais) para mostrar uma barra de progresso para poder monitorar o grep do progresso.

Mas eu realmente não sei como posso escrever este comando porque ainda existem algumas coisas que não consigo entender sobre este comando.

Alguém tem alguma ideia?

    
por Cydonia7 21.12.2011 / 18:21

6 respostas

15

pv opera em canos ( não comandos) - É um indicador de volume que mostra quantos dados ultrapassaram um determinado ponto no pipeline. Seu comando grep não é um pipeline ( | - o pipe operator está longe de ser encontrado) - é apenas um único comando fazendo o seu trabalho. pv não pode ajudá-lo aqui, você apenas tem que confiar que grep está realmente fazendo o seu trabalho em todos os arquivos de entrada.

Você poderia agrupar algo junto com find, pv, xargs & grep ( find . -name "*.rb" | pv | xargs grep [regex] parece ser promissor, mas você teria que dizer a pv quão grande é a find da saída para que ela forneça resultados significativos.

Francamente, parece mais trabalho do que vale a pena. Apenas execute seu grep, espere pacientemente e lide com a saída quando estiver pronto.

    
por 21.12.2011 / 18:55
4

Mais dois métodos:

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

Ou, em um shell diferente enquanto seu comando original está em execução, localize o pid do comando grep e, em seguida:

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

Ambos os itens acima irão mostrar em qual arquivo o comando grep está trabalhando atualmente. Você pode encontrar o número total de arquivos com:

ls -l *.rb | wc -l

Por fim, use isso para descobrir qual número o arquivo atual está na lista:

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

P.S. Minhas respostas assumem que todos os seus arquivos estão em um único diretório. Se não estiverem, você terá que usar find em vez de ls e *.rb como sugerido por thinice.

    
por 21.12.2011 / 19:28
1

Não sei qual sistema operacional você está usando, mas grep -R "string" *.ext pode não estar funcionando corretamente para você.

Você pode ser mais bem servido usando find em conjunto com grep :

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

    
por 21.12.2011 / 18:48
1

Nas versões recentes de pv , há uma "-d" -Option para assistir a todos os FDs de outro processo.

Então, em teoria, pv não funcionará apenas como um canal, mas também como um indicador de progresso para todo um processo. (Por exemplo, tente com o PID do seu Firefox)

Para o problema acima, uma idéia mais simples é a seguinte: Enquanto o grep estiver em execução, use lsof junto com watch .

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

Dessa forma, você pode monitorar o progresso do seu grep.

    
por 23.02.2015 / 14:16
0

Você já tentou

grep -R "string" *.rb | pv

Não sei se realmente funciona porque não sabe quantos bits do total de dados pesquisar porque é recursivo?

    
por 21.12.2011 / 18:36
0

Eu costumo usar o sistema de arquivos proc nos sistemas Linux, ou seja,

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

Isso lista todos os arquivos que a grep-invocation abriu no momento e, assim, dá uma impressão de onde a pesquisa está atualmente.

    
por 10.11.2015 / 16:26

Tags