最後の読み取り位置でbashのファイルを読み取る方法

最後の読み取り位置でbashのファイルを読み取る方法

継続的に更新されるログファイルがあります。 5分ごとにファイルを読み取り、awkコマンドを実行していくつかの指標をCloudwatchに送信するcronジョブを実行したいと思います。

さて、最後の読み取り操作で残ったファイルを読みたいです。

どうすればいいですか?

答え1

最後のオフセットを記録する必要があります。

bashの代わりに演算子が組み込まれているので、ksh93またはzshを使用する方が簡単です。

たとえば、ksh93の場合:

#! /bin/ksh93 -
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")

{
  do-your-processing; ret=$?

  echo "$(<#((CUR)))" > "$offset_file" && exit "$ret"
} < "$file" <#((offset))

そしてzsh

#! /bin/zsh -
zmodload zsh/system

file=/some/file.log
offset_file=$file.offset
offset=$(<$offset_file)

{
  sysseek offset || exit

  do-your-processing; ret=$?

  echo $((systell(0))) > $offset_file && exit $ret
} < $file

を使用すると、bash上記のほとんどの操作を実行し、 を呼び出したり、次を検索ksh93したり話しzshたりできます。perl

#! /bin/bash -
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")

seek() {
  OFFSET=$1 perl -e '
    seek(STDIN, $ENV{OFFSET}, 0) || die "seek: $!\n"'
}

tell() {
  perl -le 'print tell(STDIN)'
}
   
{
  seek "${offset:-0}" || exit

  do-your-processing; ret=$?

  tell > "$offset_file" && exit "$ret"
} < "$file"

ファイルが切り捨てられるたびに、file.offsetが空であるか、切り捨てられるか、ゼロが記録されていることを確認する必要があります。

関連情報