如何从上次读取位置读取bash中的文件

如何从上次读取位置读取bash中的文件

我有不断更新的日志文件。我想每 5 分钟运行一次 cron 作业,读取该文件并运行 awk 命令将一些指标发送到 cloudwatch。

现在我只想读取上次读取操作中留下的文件。

我怎样才能做到这一点 ?

答案1

您需要记录最后的偏移量。

使用 ksh93 或 zsh 会更容易,因为它们具有内置运算符,而不是 bash。

例如,对于 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,您可以执行上述大部分操作并调用ksh93zsh或者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 为空、被截断或写入 0。

相关内容