Como limitar o número de linhas que a saída de um comando tem disponível no bash?

9

Eu comecei a baixar um arquivo grande em segundo plano usando

$ nohup wget http://example.tld/big.iso &

que também me fornece um arquivo nohup.out que inclui a saída de wget .

Agora, se mais tarde eu quiser assistir o processo de download, eu poderia usar $ tail -f nohup.out , mas isso enche minha janela de terminal mais rápido do que eu gostaria. O que eu gostaria de ver é a última linha constantemente atualizando (assim como quando usando wget sozinho).

Eu tentei $ tail -n 1 -f nohup.out , mas parece afetar apenas o inicial inicial.

De um modo geral, se for possível limitar (neste caso a 1) o número de linhas que a saída de um comando tem disponível / visível, isso resolveria esse problema. Mais ou menos como ter a saída em um Buffer Circular - pense na barra de progresso normal que $ wget example.tld/big.iso imprimiria.

Existe tal solução?

Ou eu estou subindo a árvore errada? (Ou seja, seria mais fácil limitar a saída de nohup ou fazer outra coisa?)

    
por Jari Keinänen 20.10.2011 / 16:44

4 respostas

8

Se você não quiser limitar a região de rolagem (veja minha outra resposta), você também pode usar o retorno de carro para voltar ao início da linha antes de imprimir a próxima linha. Há uma sequência de escape que limpa o restante da linha, o que é necessário quando a linha atual é menor que a linha anterior.

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;
    
por 21.10.2011 / 13:30
6

Você pode usar watch aqui:

watch -n 0.5 -e "tail -n 1 nohup.out"

Editar : A opção -e (alias --exec ) parece adequada aqui. Especialmente se você pretende executar watch com intervalos muito pequenos, isso reduz a sobrecarga causada pela execução de sh -c internamente por watch em cada ciclo.

    
por 20.10.2011 / 16:48
3

Existem certas sequências de controle Xterm que você pode usar para limitar as linhas do seu terminal que são roladas. Procure por "Definir região de rolagem". É um pouco de um kludge, no entanto. Certifique-se de redefinir seu terminal depois:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.
    
por 20.10.2011 / 22:27
0

Se você não quiser que a saída ocupe toda a janela do terminal atual, você pode usar um simples loop while :

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo
    
por 21.10.2011 / 12:21