假设 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