web-dev-qa-db-ja.com

コマンドの出力がbashで利用できる行数を制限する方法は?

私はバックグラウンドで大きなファイルをダウンロードし始めました

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

これにより、wgetの出力を含むNohup.outファイルも取得されます。

後でダウンロードプロセスを監視したい場合、私は$ tail -f Nohup.outを使用することができますが、ターミナルウィンドウが思ったよりも速くいっぱいになります。私が見たいのは、(wgetだけを使用する場合と同様に)常に更新される最後の行です。

$ tail -n 1 -f Nohup.outを試しましたが、最初のテイルのみに影響するようです。

一般的に言えば、コマンドの出力が利用できる/表示できる行数を制限する(この場合は1にする)ことが可能であれば、この問題は解決します。出力を Circular buffer に並べ替える—通常の進行状況バー$ wget example.tld/big.isoが出力することを考えてください。

そのような解決策はありますか?

または私は木を間違った方法で登っていますか? (つまり、Nohupの出力を制限したり、他のことをしたりするほうが簡単でしょうか?)

11
Jari Keinänen

スクロール領域を制限したくない場合(他の回答を参照)、キャリッジリターンを使用して、次の行を印刷する前に行の先頭に戻ることもできます。残りの行をクリアするエスケープシーケンスがあります。これは、現在の行が前の行より短い場合に必要です。

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;
10
janmoesen

ここでwatchを使用できます:

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

編集-e(エイリアス--exec)オプションはここで適切に見えます。特に、非常に短い間隔でwatchを実行することを目的としている場合、これにより、各サイクルでwatchによってsh -cを内部的に実行することによって発生するオーバーヘッドが削減されます。

6
rozcietrzewiacz

特定の Xterm制御シーケンス があり、スクロールされる端末の行を制限するために使用できます。 「スクロール領域の設定」を探します。しかし、それは少々厄介です。後で端末をリセットしてください:

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.
3
janmoesen

現在のターミナルウィンドウ全体を出力で占有したくない場合は、単純なwhileループを使用できます。

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo
0
rozcietrzewiacz