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

如何仅检查自上次签入bash以来添加的行,bash,shell,logging,error-handling,cron,Bash,Shell,Logging,Error Handling,Cron,我左右为难。 我需要使用bash脚本检查日志文件。 脚本需要每5-10分钟运行一次(在crontab中设置),如果日志中出现警告或错误,则发送电子邮件。 但它必须只检查自上次检查以来添加的行,而不是一遍又一遍地检查整个文档。 我不知道如何只检查自上次检查以来添加的行,或在最近10分钟内添加的行 在我的情况下,睡眠不起作用,因为脚本不应该一直运行它应该每5-10分钟运行一次如果您的文件不是太大,您可以尝试将日志文件以前的行数存储在环境变量中,并将其与当前行数进行比较。类似于以下脚本的内容应该可以工

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

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

#!/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\u LINE\u COUNT
    :存储上一次迭代的行数的环境变量(首次启动脚本时等于0)
如果文件未更改,
$(wc-l log.file)-OLD\u LINE\u COUNT
将返回0,
head-n 0
将返回空

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


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

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

#!/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\u LINE\u COUNT
    :存储上一次迭代的行数的环境变量(首次启动脚本时等于0)
如果文件未更改,
$(wc-l log.file)-OLD\u LINE\u COUNT
将返回0,
head-n 0
将返回空

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


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

日志文件有多大?几桶?10个月?10 Go?找到了一个解决方案,我只是将行数保存在外部文件中,然后从中读取。然后使用当前行数和前一行数之差的tail日志文件有多大?几桶?10个月?10 Go?找到了一个解决方案,我只是将行数保存在外部文件中,然后从中读取。然后使用当前行数和上一行数之间的差异的尾部谢谢,我使用了您的逻辑,但没有将其保存到环境变量中,而是将行数保存到外部文件谢谢,我使用了您的逻辑,但没有将其保存到环境变量中,而是将行数保存到外部文件中