我想编写一个shell脚本,它会从给定的日志文件中找到多个字符串,例如“错误|通知|警告”,例如/ var / log / messages。如果任何字符串匹配,则应向指定的邮件ID发送邮件通知。
我可以使用:
grep -i -E '^Errors|Notice|Warnings' /var/log/messages
但我的主要问题是,日志文件总是在增长,如果我想在cron中添加这个脚本,我怎样才能记录上次执行脚本时已检查过的文件行或内容?
例如,如果日志文件是100行并且我已经使用cat或类似的东西读取了文件,那么在第二次执行之前,文件变为300行,那么现在我想从101行读取到300行。 / p>
有人可以建议我如何记录这个吗?
答案 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_first
到line_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