Como exibir o número de linhas geradas por um comando em tempo real?

Como exibir o número de linhas geradas por um comando em tempo real?

Estou usando svn exportcomo parte de um script de empacotador para meu aplicativo e parece que esse comando, como muitos outros, não possui nenhum tipo de barra de progresso.

Tenho duas opções no momento:

  • usá-lo sem opções e vê-lo imprimindo milhares de linhas
  • usando --quiete não vendo nada até que seja concluído.

Existe uma maneira de mostrar pelo menos o número de linhas geradas pelo comando, em tempo real? Como:

Exporting SVN directory ... 1234 files

E veja este número1234 incremento em tempo real? Posso imaginar canalizar a saída para um comando que faria exatamente isso, mas qual?

Responder1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

Ou coloque a seção entre colchetes em um script de shell. Observe que isso só funciona se o seu shell realmente suportar o operador de pré-incremento, como bash ou ksh93 ou zsh. Caso contrário, você terá que incrementar $Ie depois imprimi-lo (como em I=$((I+1));printf...). Além disso, se printfnão for integrado ao seu shell (é integrado ao bash atual), você poderá usar echo -neou print -npara obter melhor desempenho. Você só deseja suprimir a nova linha e interpretar \r como um caractere de escape.

Responder2

Esta é uma ideia aproximada, mas você pode usar o pvcomando para contar o número de linhas à medida que elas passam e exibi-las na tela. pventre seus muitos switches, há um -lswitch que conta cada linha à medida que ela passa.

Exemplo

Aqui estou usando um loop while para simular alguns arquivos da saída do SVN.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

Ele continuará sobrescrevendo a linha de saída assim:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

Responder3

Você pode executar seu comando em segundo plano como um trabalho e redirecionar seu stdout (e stderr opcionalmente) para um arquivo de log: command > logfile &onde &designa o trabalho (se stderr também, digamos &>em vez de >).

Então você pode usar o utilitário wordcount para contar o número de linhas em seu arquivo de log com wc -l.

Para mostrar a mudança de estado em uma linha que muda dinamicamente, você poderia usar algo como while true; do echo -en '\r'; wc -l logfile; sleep 1; done, mas não posso forçar o bash a desenhar \ro retorno de carro para eliminar o conteúdo da linha anterior.

Veja esta pergunta, é quase uma duplicata:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

informação relacionada