![如何从上次读取位置读取bash中的文件](https://linux22.com/image/132255/%E5%A6%82%E4%BD%95%E4%BB%8E%E4%B8%8A%E6%AC%A1%E8%AF%BB%E5%8F%96%E4%BD%8D%E7%BD%AE%E8%AF%BB%E5%8F%96bash%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有不断更新的日志文件。我想每 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
,您可以执行上述大部分操作并调用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 为空、被截断或写入 0。