web-dev-qa-db-ja.com

日付、時刻、文字列を確認してメールをトリガーするスクリプトを作成します

ログファイルの最後の数行を取得し、開始日の最後の行に今日の日付と時刻17:00:xxが含まれ、その後にxxxxx行が更新されていることを確認するスクリプトを作成する必要があります。コミットが完了しました。スクリプトは、現在の日付と時刻(17)に「行が完了した」文字列があるかどうかを確認します。メールをトリガーしない場合。

以下はログファイルのフォーマットです。

Start Date, Tue Jan 28 17:00:01 +03 2019
23468 rows updated.
Commit complete. 
--------------------------------------------
Start Date, Tue Jan 28 21:00:01 +03 2019
13369 rows updated.
Commit complete. 
--------------------------------------------
Start Date, Tue Jan 29 17:00:01 +03 2019
33099 rows updated.
Commit complete.
--------------------------------------------
Start Date, Tue Jan 29 21:00:01 +03 2019
21970 rows updated.
Commit complete.

以下は私が試したコードです:

TIME=$(date '+%H%M')

l=$(cat /Data/v3/currlog.txt | grep "rows updated." | wc -l)

if [ $l -eq 0 ] && [ $TIME -eq 1700 ] ; then
echo "Please check if the records are updated" |  mailx -S  "check the rejection script" [email protected]

fi

しかし、上記のスクリプトは私の目的を解決していません。

私の必要性を明確にするために:

ログファイル(currlog.txt)が今日次のように更新されたとします。

Start Date, Sat Feb  2 05:00:01 +03 2019
2708722 rows updated.
Commit complete.

スクリプトを6で実行するようにスケジュールすると、行が5で更新されたかどうかを確認する必要があります。そうでない場合は、メールをトリガーする必要があります。

ログファイルは毎日同じ形式で更新されます。

2

ログから最後の3行を抽出し、今日のタイムスタンプがこれらの3行に含まれていることを確認するというアプローチを採用しました。

#!/bin/bash

today_time=$(date -d 'today 5 PM' '+%a %b %e %H:%M')

if ! tail -n3 /Data/v3/currlog.txt | grep "$today_time" &> /dev/null ; then
        echo "Please check if the records are updated" |  mailx -S  "check the rejection script" [email protected]
fi

GNU dateコマンドを使用して、同じ日の5 PM)の日付文字列を取得します。指定した形式で日付を次のように出力します。ログファイルのタイムスタンプに対して検索できる「SatFeb217:00」。

1
Haxiel

以下のコマンドで確認し、正常に動作しました

 d=`date +"%d"`
 m=`date +"%b"`
y=`date +%Y`
awk -v d="$d" -v m="$m" -v y="$y" '$4 ==  m && $5 == d && $NF == y && $6 ~ /^17/ {x=NR+2}(NR<=x){print }' filename
0