Bashを使用して、過去1分間にファイルに追加された新しい行をどのように計算できますか?
複数のファイルの最後の1分新しい行を同時に計算して出力を取得する最も賢い方法は何ですか?
いくつか試してみましたが、良い解決策が見つかりませんでした。
Bashの代わりにプログラミング言語を試すこともできます。
答え1
2回使用しwc -l
て結果を減算します。
before=$(wc -l < yourfile)
sleep 60
after=$(wc -l < yourfile)
let dif=after-before
echo "$dif"
最後の$dif
数行だけを印刷することもできます。
tail -n$dif yourfile
より多くの行を同時に追加できますが、ここでは原子的な操作はありません。
wc -l
増分変更(少なくとも追加された行数)を追跡するには、1分ごとに出力を記録します。ただし、この機能が必要かどうかを事前に知らない限り、これはできません。各行にタイムスタンプがない場合、ファイルのどの部分がいつ追加されたかはわかりません。
答え2
これが私の最終的な解決策です。
#!/bin/bash
for i in *access_log; do
(
before=$(wc -l < $i)
sleep 10
after=$(wc -l < $i)
let dif=after-before
echo "$i: $dif"
) &
done
答え3
{
tail -c 1 > /dev/null
sleep 60
wc -l
} < your-file
そしてksh93
:
{ sleep 60; wc -l; } < your-file <#((EOF))
ファイルを開き、最後(最初の読み取りからバイトを削除)を見つけて60秒間待機し、計算を呼び出してwc -l
1分前の場所とファイルの終わり(新しい行間の改行数)を計算します。 (より大きい場合)。
この60秒間追加された部分のみを読み込みます。ファイルが完全に書き換えられた場合、ファイルの元の部分の改行数に対する結果の変更は考慮されません。
また、ファイルが削除されたか、同じ名前のファイルが再作成された場合、またはファイルが元々開かれたディレクトリにリンクされている場合でも、元のファイルの変更を確認します。
ログファイルにどのような速度で行が追加されるかを知りたい場合は、次のようにpv -l
使用する別のオプションがありますtail -f
。
for f in *access_log; do
tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait
-ra
現在および平均金利。-l
したがって、比率は数量で表されます。ワイヤー毎秒。