このスクリプトはログファイルの「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
次のオプション2を表示私のコメント〜のようにOPの要請に応じて:
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
その行番号を実行し、tailにパイプし、次にgrepにパイプする必要があります。それ以外の場合は、ログファイルがその間に大きくなり、次の行を見逃す可能性があります。または、順序を変更した場合は、同じ行を2回解析できます。head
grep
wc
上記は、ログファイルへの書き込みが1行につき1つのアトミック操作で実行されると想定しています。部分行を個別に書き込み、完了時に改行を追加する場合は、最後(および部分)行を無視する必要があります。上記の解析されたログファイル。