web-dev-qa-db-ja.com

リストとしての「watch」コマンドの出力

ログファイルに追加された1分あたりの行数を簡単に計算したいのですが。

1秒ごとのカウントも保存したい。

私が必要なのは、毎秒更新されるリストとしての次のコマンドの出力です。

watch -n1 'wc -l my.log'

「watch」コマンドの「update」をリストとして出力するには?

28
JohnJohnGa

-twatchに切り替えて、ヘッダーを印刷しないようにします。ただし、それでも画面はクリアされるため、単純なシェルループを使用した方がよい場合があります。

while sleep 1; do
    wc -l my.log
done

利点の1つは、他のコマンド(dateなど)を簡単に追加したり、sedを介して出力をパイプ処理したりして再フォーマットできることです。ちなみにスワップするとsleep 1ループでwcを使用すると、エラー時に自動的に終了します。

27
peterph

古い質問ですが、私は非常に簡単な答えを見つけました:

watch -n1 'wc -l my.log | tee -a statistics.log'

これにより、毎秒wcが実行され、その出力がstatistics.logファイルに追加され、画面に表示されます。
つまり、my.logの連続する行数を表す、数字で満たされたファイルになります。

8
Orabîg

いかがですか

tail -f file.log | pv -rl > /dev/null
3

以下を試してください:

watch -n1 'wc -l my.log >> statistics.log'
3
Andy

du -sh $data_pathからより良い/ログに記録された出力を取得しようとしたときに、この質問に遭遇しました。ここにある「while command、do sleep」パターンを使用しましたが、必要な出力を提供するためにいくつかの複雑なAWKを使用しました。

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

私は実際にはこれをワンライナーとしてやったので、セミコロンがあります。しかし、それを読みやすくするために、私はそれを取り出しました。出力は次のようになります。

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
1
Bruno Bronosky

それを行うスクリプトを作成できます。私はkeepを呼び出し(これを続けます)、binパスに配置しました。

これは私のスクリプトです:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done
1