Bashからコマンドに出力される行数を制限する方法は?

Bashからコマンドに出力される行数を制限する方法は?

以下を使用して、バックグラウンドで大容量ファイルのダウンロードを開始しました。

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

これも私にnohup.outインクルードを提供しますwget

今後ダウンロードプロセスを見たい場合できる使用します$ tail -f nohup.outが、必要なものよりも早く端末ウィンドウが埋められます。私が見たいのは、最後の行が継続的に更新されることです(単独でwget使用されている場合のように)。

試してみましたが、$ tail -n 1 -f nohup.out最初の尾にのみ影響を与えるようです。

一般的に言えば、この問題は、コマンド出力に使用可能/表示される行数を制限(この場合は1)できる場合は解決できます。出力を入れるのと似ています。循環バッファ- 一般的な進行状況バーが$ wget example.tld/big.iso印刷されると思います。

これに対する解決策はありますか?

それとも私が木に間違って登っているのでしょうか? (つまり、nohup出力を制限したり、他のタスクを実行する方が簡単ですか?)

答え1

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

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;

答え2

ここで使用できますwatch

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

編集する:(-eエイリアス--exec)オプションがここに適しているようです。特に、非常に小さな間隔で実行することが目標である場合、watch各サイクル内で実行することによって生じるオーバーヘッドが減少します。sh -cwatch

答え3

特定がある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.

答え4

出力が現在の端末ウィンドウ全体を占有しないようにするには、単純なwhileループを使用できます。

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

関連情報