ファイルの末尾に5秒のデータを追加するには?

ファイルの末尾に5秒のデータを追加するには?

たとえば、シェルスクリプトがfile.txtにデータを追加するとします。

1...........
2...........
3.............
4.............
5..............

これで、データ全体の代わりに5秒以内にfile.txtに追加された新しいデータを確認できる別のスクリプトが必要です。

tail -fデータ全体を表示するオプションがあるかどうかわかりません。

-5のようなものを理解するのに便利なのは、行数ではtail -5 file.txtなく秒数です。

注:最後に残りのデータを提供する必要があるたびにデータを見逃したくありません。これは重要です。

答え1

retail状態を保存 tail。各呼び出しの後、inode番号とファイルサイズを記録し、次の呼び出しは中断された部分から続きます(オプションで回転するファイルも処理されるため、inodeが記録されます)。

while true; do 
    retail myfile.log
    sleep 5
done

retailファイルデータ自体にタイムスタンプ(syslogを介している可能性があります)または単調に増加するIDが含まれていない限り、ファイルサイズを使用していくつかの外部状態が必要です。

ファイルが1行ずつ追加され、フラッシュされると仮定すると、retailデータは失われません。また、精度が高くない場合(たとえば、µs以上)、データのタイムスタンプを確認するよりも安定している必要があります。

retailCで書かれており、@Ulrich Dangelの提案と似ていますlogtail。 2つの異なるバージョンがあるようです。どちらもPerlで実装されていますが、どちらも使用しませんでした。

答え2

最後の5つを抽出できます。ワイヤースクリプトでは、tail -n 5ファイルの最後の変更にのみタイムスタンプが書き込まれ、すべての変更は行われません。最後に検索したい場合N秒単位で別々に保管する必要があります。

データを数量化できます。たとえば、スクリプトは毎秒起動されるメインループに関数を生成します。

 CSEC=`date +%S`
 if [ "x$CSEC" != "x$SAVEDSEC" ] ; then
    mv f4.txt f5.txt
    mv f3.txt f4.txt
    mv f2.txt f3.txt
    mv f1.txt f2.txt

    echo $BUFFER > f1.txt
    BUFFER=
    SAVEDSEC=$CSEC
 fi

たとえば、データが書き込まれる場所には、そのデータがバッファechoに追加されます。

echo $DATA >file.txt
BUFFER=$BUFFER$DATA

(そして書き込みは「file.txt」に書き込むのではなく$ BUFFERに保存されます)

この場合、スクリプトはcat f?.txt最後の5秒のデータを取得できます。

もちろん閉鎖に注意してください。あるスクリプトが別のスクリプトのディスク操作中にデータを読み取ると、データが破損します。

答え3

これはあなたが望むものを正確に行う必要があります...

#!/bin/bash

#This is the file we want to capture data from
TAILFILE=/path/to/input.txt

#This is the file we want to append to
OUTFILE=/path/to/output.txt

#How many seconds we want to tail the file
SECONDS=5

tail -F $TAILFILE >> $OUTFILE &
PID=$!
sleep $SECONDS
kill $PID

関連情報