如何将五秒的数据附加到文件末尾?

如何将五秒的数据附加到文件末尾?

假设 shell 脚本将数据附加到 file.txt 中,例如

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

现在我想要另一个脚本,可以在五秒内检查附加到 file.txt 的新数据,而不是完整数据。

我不知道是否有任何选项可以tail -f显示完整的数据。

用于理解诸如tail -5 file.txt-5 不是行数而是秒数之类的内容。

注意:我不想错过任何数据,每次它都应该给我上次留下的数据。这很重要。

答案1

retail是一个有状态的 tail。它在每次调用后记录 inode 编号和文件大小,下一次调用将从中断处继续(也可以选择处理旋转文件,这就是记录 inode 的原因)。

while true; do 
    retail myfile.log
    sleep 5
done

除非文件数据本身包含时间戳(如果是通过系统日志,则可能)或一些单调递增的 ID,否则您必须有一些外部状态,retail使用文件大小。

假设文件仅被追加并逐行刷新,retail不会丢失数据。它还应该比检查数据中的时间戳更可靠,除非它们具有高精度(例如 µs 或更好的精度)。

retail是用 C 编写的,看起来类似于 @Ulrich Dangel 的建议logtail。似乎有两个不同的版本,都是用 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

(并且写入存储在 $BUFFER 中而不是写入“file.txt”)

在这种情况下,您的脚本可以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

相关内容