如何仅检查自上次检查bash以来添加的行

时间:2017-07-19 14:57:47

标签: bash shell logging error-handling cron

我陷入两难境地。 我需要使用bash脚本检查日志文件。 该脚本需要每5-10分钟运行一次(在crontab中设置)并在日志中出现警告或错误时发送电子邮件。 但它必须只检查自上次检查后添加的行,而不是一次又一次地遍历整个文档。 我不知道如何只检查自上次检查后添加的行,或者在过去10分钟内添加的行 睡眠不能在我的情况下工作,因为脚本不应该每5到10分钟就应该运行一次

1 个答案:

答案 0 :(得分:0)

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

#!/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:environement变量,我们存储上一次迭代的行数(当我们第一次启动脚本时等于0)

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

如果日志文件太大,wc -l将花费大量时间,因此在这种情况下我的方法不会被推荐。

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