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

14

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

Eu tenho duas escolhas no momento:

  • usando sem opções e assista a impressão de milhares de linhas
  • usando --quiet e 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? Tais como:

Exporting SVN directory ... 1234 files

E veja este número 1234 incremento em tempo real ? Eu posso imaginar colocar a saída em um comando que faria exatamente isso, mas qual delas?

    
por Benjamin 06.10.2013 / 18:46

3 respostas

14

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

Ou coloque a seção entre colchetes em um script de shell. Note que isto só funciona se o seu shell realmente suportar o operador de pre-incremento, como bash ou ksh93 ou zsh. Caso contrário, você terá que incrementar $I e depois imprimi-lo (como em I=$((I+1));printf... ). Além disso, se printf não for embutido em seu shell (ele é incorporado ao bash atual), você poderá usar echo -ne ou print -n para obter um melhor desempenho. Você só quer suprimir a nova linha e ter interpretado como um caractere de escape.

    
por 06.10.2013 / 20:07
7

Esta é uma idéia aproximada, mas você pode usar o comando pv para contar o número de linhas que estão passando e exibir isso na tela. pv entre seus muitos switches tem um -l que conta cada linha conforme ela passa.

Exemplo

Aqui estou usando um loop while para simular alguns arquivos da sua saída 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á substituindo a linha de saída assim:

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

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]
    
por 06.10.2013 / 21:09
0

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 job (se stderr também, digamos &> em vez de > ) .

Em seguida, você pode usar o utilitário wordcount para contar o número de linhas no seu arquivo de log com wc -l .

Para mostrar a mudança de estado em uma linha que muda dinamicamente, você pode 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 \r carriage return para eliminar o conteúdo da linha anterior.

Veja esta pergunta, é quase uma duplicata: link

    
por 06.10.2013 / 20:07