此脚本监视日志文件中的模式“ora”,提取错误详细信息并发送电子邮件。在这种情况下,我只想提取日志文件中出现的最后一个错误。我每 5 分钟设置一次 crontab,因此 grep 会提取导致错误警报的相同旧错误。脚本应该获取当前时间的错误,并避免查找旧错误。
mailto=xyz.email.com
logdirectory=/location/to/logfile
cd $logdirectory
grep "ORA" logfile
if [ $? = 0 ]; then
mailx -s "errors" $mailto
fi
我的日志文件:
Fri Jun 07 05:09:32 2019 Archived Log entry 93 added for thread 1 sequence 59 ID 0xf10d426f dest 1:
Fri Jun 07 11:08:20 2019 07-JUN-19 ORA-1100: Testing, Please Ignore
答案1
awk -v parseLog='/some/where/filename' '
BEGIN {
prevNR=( (getline line < parseLog) > 0 ? line : 0 )
}
(NR>prevNR) && /ORA/{ print; found=1 }
END {
print NR > parseLog
exit !found
}
' /location/to/logfile
或在外壳中:
parseLog='/some/where/filename'
IFS= read -r line < "$parseLog"
if [[ -n "$line" ]]; then
prevNR="$line"
else
prevNR=0
fi
nr=$(wc -l < /tmp/logfile)
head -"$nr" /location/to/logfile |
tail +"$(( "$prevNR" + 1 ))" |
grep ORS
rslt=$?
printf '%d\n' "$nr" > "$parseLog"
请注意,您需要先获取行数,然后对该行数wc
执行 a并将其通过管道传输到 tail,然后再传输到 grep,否则日志文件可能会在和之间增长,然后您会错过下一行或者如果你交换了它们的顺序,那么你可以解析同一行两次。head
grep
wc
请注意,上面假设写入日志文件的内容在每行 1 个原子操作中执行 - 如果它单独写入部分行,然后在完成后附加换行符,那么您需要忽略最后一行(可能是部分行)上述解析的日志文件。