1

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

我可以用:

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

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

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

谁能建议我如何记录这个?

4

2 回答 2

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'

于 2012-01-26T19:47:32.880 回答
1

轮换您的日志文件可能是最好的解决方案。

但是,如果您想从 grep 文件line_firstline_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
于 2012-01-26T19:42:17.090 回答