在文件中查找多个字符串,并在出现任何定义的字符串时发送电子邮件



我想写一个shell脚本,从给定的日志文件(如/var/log/messages)中查找多个字符串,如"Errors|Notice|Warnings"。如果任何字符串匹配,它应该向指定的邮件ID发送邮件通知。

我可以使用:

grep -i -E '^Errors|Notice|Warnings' /var/log/messages

但我的主要问题是,日志文件总是在增长,如果我想在cron中添加这个脚本,我如何记录上次执行脚本时已经检查过的文件行或内容?

例如,如果日志文件是100行,并且我已经使用cat或类似的方法读取了该文件,那么在第二次执行之前,该文件变为300行,那么现在我想从101行号读取到300。

有人能建议我如何录制吗?

您可以使用以下脚本来执行此操作:

start=0
[[ -f last-processed ]] && start=$(<last-processed)
start=$((start+1))
tail +$start /var/log/messages | grep -i -E 'Errors|Notice|Warnings' &&
wc -l /var/log/messages | awk '{print $1}' > last-processed

顺便说一句,如果你的regx有问题,它应该是'Errors|Notice|Warnings'而不是'^Errors|Notice|Warnings'

旋转日志文件可能是最好的解决方案。

但如果您想将文件从line_first grep到line_last,您可以使用sed:

例如,从输入流中获取从100到110的行:

$> line_first=100; line_last=110
$> seq 1 1000 | sed -n "${line_first},${line_last}p"
100
101
102
103
104
105
106
107
108
109
110

相关内容

最新更新