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

时间:2012-01-26 19:25:45

标签: bash shell grep cat

我想编写一个shell脚本,它会从给定的日志文件中找到多个字符串,例如“错误|通知|警告”,例如/ var / log / messages。如果任何字符串匹配,则应向指定的邮件ID发送邮件通知。

我可以使用:

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

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

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

有人可以建议我如何记录这个吗?

2 个答案:

答案 0 :(得分:3)

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

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'

答案 1 :(得分:1)

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

但是如果你想从line_firstline_last grep文件,你可以使用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