ファイルの最後の瞬間に新しい行数を数えます。

ファイルの最後の瞬間に新しい行数を数えます。

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 -l1分前の場所とファイルの終わり(新しい行間の改行数)を計算します。 (より大きい場合)。

この60秒間追加された部分のみを読み込みます。ファイルが完全に書き換えられた場合、ファイルの元の部分の改行数に対する結果の変更は考慮されません。

また、ファイルが削除されたか、同じ名前のファイルが再作成された場合、またはファイルが元々開かれたディレクトリにリンクされている場合でも、元のファイルの変更を確認します。

ログファイルにどのような速度で行が追加されるかを知りたい場合は、次のようにpv -l使用する別のオプションがありますtail -f

for f in *access_log; do
  tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait

-ra現在および平均金利。-lしたがって、比率は数量で表されます。ワイヤー毎秒。

関連情報