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?

Cydonia7
fonte

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.

voretaq7
fonte
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.

Ladadadada
fonte
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"

gelo fino
fonte
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.

Jan Walzer
fonte
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?

nhutto
fonte
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.

centic
fonte