「ウォッチ」コマンドのリストとしての出力


27

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

毎秒のカウントも保存したいです。

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

watch -n1 'wc -l my.log'

「監視」コマンドの「更新」をリストとして出力する方法は?

回答:


24

ヘッダーを出力しない-tスイッチを使用できますwatch。ただし、それでも画面はクリアされるので、単純なシェルループを使用する方がよい場合があります。

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

利点の1つは、他のコマンド(例:)を簡単に追加しdateたり、出力をパイプ処理しsedて再フォーマットしたりできることです。ところで、ループ内でスワップsleep 1するwcと、エラーが発生すると自動的に終了します。


それは正確に毎秒それをしないだろうことに注意してください(zshのかは、ksh93で、あなたはかかわらず、ループ内のコマンドを実行することによって発生したドリフトのためにそう口座へと睡眠時間を調整することができます)
ステファンChazelas

2
@StephaneChazelasはどちらにも対応しません。wait試してみてくださいwatch -n 1 "sleep 5"
ペテルフ

確かに(procpsとbusyboxの両方の実装を確認しました)。私はそれだけwatchが有用だと思ったが、それでもあなたに与えないので、あなたの解決策は時計ベースのものと同じくらい良いが、どちらも「ログファイルが成長する率」問題に非常に正確に答えない。
ステファンシャゼル

1分あたりの行数が最終的な目標であれば、10秒に1回サンプリングするだけで十分です。したがって、オーバーヘッドはそれほどひどくはありません(もちろん、ファイルが本当に大きくならない限り)。そして、実際にはループ内から、タイミング情報を(必要に応じてコマンドが終了する前と終了後の両方で)印刷することができ、その後、大きなファイルでも精度が向上します(桁違い)。
ペテルフ

1
@peterphにwatchは、-p可能な限りそのようにするオプションがあります(明らかに、複数の同時アクセスが許可されていない場合、1秒ごとに5秒かかるコマンドは実行できません)。知っている、私はそれを書いた:-P
デロバート

8

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

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

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


このコマンドはwatch "($MYCMD | tee -a $MYLOG)"であることに注意してくださいwatch "($MYCMD)" | tee -a $MYLOG。私のようにこれを間違えた場合、出力は非常に混乱するでしょう。ここで注意すべきもう1つの点は、このコマンドではデフォルトで各コマンドの実行のタイムスタンプが追加されないため、ループを使用した回答が引き続き適切に機能する可能性があることです。
駆け巡る



1

からより良い/ログ出力を取得しようとしていたときにこの質問に出くわしましたdu -sh $data_path。ここでは「whileコマンド、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

0

あなたのためにそれを行うスクリプトを作成できます。私は私のものを呼び出してkeep(例えば、やり続けて)binパスにそれを置きました。

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

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

1
"$@"unquotedの代わりにを使用してコマンド(引数)を実行する必要があります$*。この方法では、ユーザーが期待するように、シェルに引用符で囲まれた引数などを保持させます。FTFY。
ロアイマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.