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


11

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

Eu poderia ter feito assim: grep -R "string" *.rbmas leva muito tempo e eu gostaria de usar o pv (pipe viewer) para mostrar uma barra de progresso para poder monitorar o grepprogresso.

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

Alguém tem alguma ideia?

Respostas:


15

pvopera em pipes (não comandos) - é um medidor de volume que mostra quantos dados passaram por um determinado ponto no pipeline.
Seu comando grep não é um pipeline ( |- o pipe operatorlugar não pode ser encontrado) - é apenas um único comando fazendo sua parte. pvnão pode ajudá-lo aqui, você só precisa confiar que grepestá realmente funcionando em todos os arquivos de entrada.

Você pode criar algo junto com find, pv, xargs & grep ( find . -name "*.rb" | pv | xargs grep [regex]parece promissor, mas você teria que dizer pvqual o tamanho da findsaída para obter resultados significativos.

Francamente, parece mais trabalho do que vale a pena. Basta executar o grep, esperar pacientemente e lidar com a saída quando terminar.


1
É definitivamente possível , é só complicado e provavelmente vai demorar mais tempo para montar e começar a trabalhar do que apenas esperando o grep ao fim :-)
voretaq7

1
Pode ser um realmente bom trecho: p
Cydonia7

4

Mais dois métodos:

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

Ou, em um shell diferente enquanto o comando original estiver em execução, encontre o pid do comando grep e, em seguida:

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

Ambas as opções acima mostrarão 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]

PS Minhas respostas assumem que todos os seus arquivos estão em um único diretório. Se não estiverem, você terá que usar findem vez de lse *.rbcomo thinice sugeriu.


1
Isso é uma boa alternativa
Cydonia7

1

Não tenho certeza de qual SO você está usando, mas grep -R "string" *.extpode não estar funcionando corretamente para você.

Você pode ser melhor atendido usando findem conjunto com grep:

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


Certo, o comando que eu dei realmente funciona no Fedora 16, mas o seu é mais claro. Obrigado !
precisa saber é o seguinte

1

Nas versões recentes do, pvexiste uma opção "-d"para assistir a todos os DFs de outro processo.

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

Para o problema acima, uma idéia mais simples é a seguinte: Enquanto o grepestiver em execução, use lsofjunto com watch.

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

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


0

Você já tentou

grep -R "string" *.rb | pv

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


4
Eu não acho que isso fará o que ele quer - pvestará operando na saída do grep (portanto, mesmo se ele especificou o tamanho total da entrada, pvapenas vê a saída saindo pelo final do pipe - seria muito mais sob
contagem de

0

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

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

Isso lista todos os arquivos que a chamada grep abriu atualmente e, portanto, dá uma impressão de onde está atualmente a pesquisa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.