最後に中断したところからログファイルを読み続けます。

最後に中断したところからログファイルを読み続けます。

一定期間が経過すると、常に更新(新しい行を追加)するログファイルがあります。

10分ごとにファイルからエラーメッセージのみが受信されます。

最初はすべての行を新しいファイルに抽出し、「ERROR FOUND」一致パターンを使用しました。アッ

しかし、10分後にログファイルに新しい行が追加されるので、ログファイルを残した場所から読みたいと思います。最初から始めたくありません。

誰でも私に最高のコードやスクリプトを提案できますか?

答え1

次のファイル記述子でファイルを開くと:

exec 3< /path/to/log/file

その後、処理できます。

awk '...' <&3

awkその後、fd 3は左の位置を指します。

10分後、同じシェル呼び出しで次のコマンドを実行できます。

awk '...' <&3

新しいデータを処理するためにコマンドを再発行します。

別のシェル呼び出しで読み取りを再開できるように現在位置を保存するには、ksh93次のようにします。

#! /usr/bin/env ksh93
file=/path/to/some-file
offset_file=$file.offset

exec 3< "$file"
[ -f "$offset_file" ] && exec 3<#(($(<"$offset_file")))

awk '...' <&3

echo "$(3<#((CUR)))" > "$offset_file"

またはzshを使用してください。

#! /usr/bin/env zsh

zmodload zsh/system
file=/path/to/some-file
offset_file=$file.offset

exec 3< $file
[ -f "$offset_file" ] && sysseek -u 3 "$(<$offset_file)"

awk '...' <&3

echo $((systell(3))) > $offset_file

答え2

私はStéphaneの答えがファイル全体を読み続けていないので、好きなので、ここに追加しました。強く打つ(Linuxでは)彼のソリューションと同じです(bashには組み込みの機能seektellパフォーマンスはありません)。コメントを残したかったのに評判が低すぎますね。

LASTPOS=/tmp/saved_pos

exec 3< "$1"
test -f "$LASTPOS" && STARTPOS=$(($(<$LASTPOS)+1))
tail -c "+${STARTPOS:-1}" <&3 | grep "ERROR FOUND"
grep '^pos:' /proc/self/fdinfo/3 | cut -f2 > "$LASTPOS"

また、一般的に高速なので、awkコマンドをaに置き換えました。追加の処理が必要な場合は、出力をコマンドにパイプできます。grepawk

答え3

wc -l私はandを試してみますtail
Bashを使用している場合は、次のように動作します。

#!/bin/bash
LASTLNFILE=/tmp/lastline     # replace with a suitable path
test -f $LASTLNFILE && LASTLN=$(<$LASTLNFILE)
CURLN=$(wc -l $1 | cut -d' ' -f1)

if ((CURLN-LASTLN > 0)); then
  tail -n $((CURLN-LASTLN)) $1
fi
echo $CURLN > $LASTLNFILE

PSたとえば、awkプログラムの前にこれをフィルタとして使用します(名前を「newlines.sh」と仮定):

./newlines.sh <log_file> | awk -f <your_awk_program>`

上記のスクリプトを例として使用する方法を紹介します。しないでください。スクリプトを作成してから、スクリプトの実行中にログファイルが更新される限り、競合状態に脆弱であることに気づきました。

純粋なAWKアプローチを使用する方が良いです。

#!/bin/awk

BEGIN { 
  lastlinefile = "/tmp/lastlinefile"
  getline lastline < lastlinefile
}

NR > lastline && /ERROR FOUND/ {
  # do your stuff...
  print
}

END { print NR > lastlinefile }

関連情報