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


11

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

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

これによりnohup.out、の出力を含むファイルも得られますwget

これで、後でダウンロードプロセスを確認したい場合使用できます$ tail -f nohup.outが、ターミナルウィンドウが思ったより早くいっぱいになります。私が見たいのは、最後の行が絶えず更新されていることです(wget単独で使用する場合と同じです)。

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

一般的に言えば、コマンドの出力が利用できる/表示できる行数を制限する(この場合は1にする)ことが可能であれば、この問題は解決します。出力をCircularバッファに入れるようなものです。通常のプログレスバー$ wget example.tld/big.isoが印刷されると考えてください。

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

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

回答:


10

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

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;

6

watchここで使用できます:

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

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


2
これtailにより、毎秒新しいプロセスが生成されることに注意してください。また、watch -n 0.1「常に更新する」部分をシミュレートするには、必ず1秒未満の間隔(など)を指定してください。(これにより、プロセス数とファイルオープンコール数も明らかに増加します。)最後に、OS Xを使用している場合はwatch、MacPortsから取得できます。これは、デフォルトでは使用できません。
janmoesen '10

これは少し回避策ですが、それ自体は素晴らしいです。以前の出力が表示されるように、フルスクリーンではない回答を期待していましたが、実際にはwatch新しいターミナルウィンドウで使用できました。また、少なくとも1秒間隔でを使用tail -n 2するよりも-n 1を使用する方が便利であることもわかりました。そうしないと、最新のパーセンテージが表示されない可能性があります。これはあなたの答えの欠陥ではありませんが、誰か他の人がwgetsテール付きnohup出力を見ることにした場合はそれを述べました。wgetwatch
JariKeinänen、2011年

@janmoesenこの特定のシナリオでは、新しいtailプロセスを持っていることは多すぎることではないでしょう。しかし、一般的な答えとして、これは考慮に入れるのに適しています。また、機能しwatch -n 0.1なかったが、watch -n 0,1機能したことにも気づきました。以前にターミナルコマンドオプションに適用されたロケールを見たことはありませんが、適用されたロケールがあるかもしれません。サイドノートとして:brew install watch素晴らしい仕事だけでなく:-)
ヤリKeinänen

補足:watchが動作する0,10.1、ロケール設定に依存するか(ロケールに定義されている小数点記号を使用します)。確認してくださいLC_ALL=C watch -n 0.1 "date +%S.%N"
rozcietrzewiacz 2011年

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.

<ここには、非移植性に関する通常のメモを挿入>
janmoesen '20 / 10/20

これはもう1つの優れた代替策ですが、専用ウィンドウでtail -f引き続き使用されます。これは、依然としてバッファーがいっぱいであり、ターミナルが後でリセットされる必要があるためです。これは私が期待したほどインラインではありませんが、それ以外の場合は私が求めていたものかもしれません。
JariKeinänen、2011年

0

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

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

1
一方で、端末出力をスクロールすることができにあることに注意してください任意の出力生成コマンドが実行されている、あなたの端末エミュレータの設定を無効編集する必要がありますscrollTtyOutput(または類似の)オプションを選択します。
rozcietrzewiacz 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.