仅保留最后 n 行的特殊文件

仅保留最后 n 行的特殊文件

有没有办法在 Linux 下创建仅保留最后 100 行的特殊文件?我有一个填充日志文件的过程,我想定期解析其最后 100 行。

我知道我可以使用某种类型的 logrotate,但是有没有办法创建一个特殊的文件,该文件会填满直到达到 100 行,然后添加一行并删除最旧的一行,以便文件只保留 100 行?(一种基于行的 FIFO)

多谢

答案1

日志是文本(类似)文件,并且是那种,当新行需要时将新的磁盘块附加到其中是任何文件系统都支持的快速操作。

但是,在出现新行时不断删除第一行意味着至少要不断重新组织文件的部分(如果不是全部的话)。这意味着日志记录的开销很大,而我们希望日志记录具有的最重要的特性之一就是轻量级。

文件系统没有为此做好准备(至少我没有听说过这种类型),这就是为什么在最后的记录很重要时使用 logrotate/tail/database-backed 日志记录的原因。

答案2

假设您有一个脚本,每次运行时只处理最后 100 行,那么最好使用命令捕获这些行tail,因为它几乎可以完成您想要做的事情。这里的关键是开关,-n它指示应该捕获多少行(从末尾开始)。

您可以tail -n 100 somefile.log直接将其合并到脚本中,也可以定期运行tail -n 100 somefile.log > onlylast100lines.log以创建仅包含最后 100 行的文件。后一种方法每次都会重写目标文件,因此无需在每次运行之间删除它。

答案3

详细说明 Jarmunds 方法,您可以编写如下 bash 脚本:

while true; do 
    tail -n 100 somefile.log > onlylast100lines.log
    sleep 5
done

这将每 5 秒将 somefile.log 的最后 100 行解析为 onlylast100lines.log。每次都会覆盖该文件,因此它始终只有最后 100 行。这可以添加到您的登录脚本或您希望执行此操作的任何运行级别。

相关内容