【问题标题】:how to check only lines that were added since last check in bash如何仅检查自上次签入bash以来添加的行
【发布时间】:2017-12-24 22:41:57
【问题描述】:

我有一个难题。 我需要使用 bash 脚本检查日志文件。 该脚本需要每 5-10 分钟运行一次(在 crontab 中设置)并在日志中有警告或错误时发送电子邮件。 但它必须只检查自上次检查以来添加的行,而不是一次又一次地检查整个文档。 我不知道如何只检查自上次检查以来添加的行,或过去 10 分钟内添加的行 在我的情况下睡眠不起作用,因为脚本不应该一直运行它应该每 5-10 分钟执行一次

【问题讨论】:

  • 您的日志文件有多大?几个ko? 10 个月? 10 去?
  • 找到了一个解决方案,我只是将行数保存在外部文件中,然后从中读取。然后使用当前行数和上一个行数之间的差异尾部

标签: bash shell logging error-handling cron


【解决方案1】:

如果您的文件不是太大,您可以尝试将日志文件的先前行数存储在环境变量中,并将其与当前行号进行比较。类似以下脚本的东西应该可以工作:

#!/bin/bash

#here, detect_errors is a placeholder name for the function you already developped
#we use only the lines we haven't seen yet in our detect_errors function
detect_errors "$(head -n $(($(wc -l log.file) - OLD_LINE_COUNT)) log.file)"

#we update the new value for the $OLD_LINE_COUNT
export OLD_LINE_COUNT="$(wc -l log.file)"

详细说明

  • head -n X myfile :显示myfile 的前 X 行
  • $(( ... ))bash 中的算术计算
  • wc -l log.file : 我们文件的行数
  • $OLD_LINE_COUNT : 环境变量,我们存储上一次迭代的行数(当我们第一次启动脚本时等于 0)

如果文件不变,$(wc -l log.file) - OLD_LINE_COUNT 将返回 0,head -n 0 返回空。

如果日志文件太大,wc -l 会占用很多时间,所以在这种情况下我的方法不会被推荐。

编辑:我没有问过您的日志文件是如何递增的。如果在文件末尾添加了附加行,则应使用tail -n 而不是head -n

【讨论】:

  • 谢谢,我使用了你的逻辑,但我没有将其保存到环境变量中,而是将行数保存在外部文件中
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 2012-04-22
  • 2012-08-14
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多