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