以下のようにカンマで区切られたフィールドがあります。これはコマンドの出力ですnodestat
。
node mode : produce , modify time: 2014-11-22 04:23:28
node status: active , modify time: 2014-11-22 04:23:28
以下の条件がすべて発生した場合は「OK」を印刷したいと思います。
- 「ノードモード:作成」(最初の行、最初の列)と
- 「ノード状態:アクティブ」(2行目、1列目)と
- 修正時間が昨日より短い。 (最初の行、2番目の列)
それ以外の場合は「NOT OK」を印刷します。
答え1
awk
そのために、次のような短いスクリプトを作成しました。
nodestat |awk -v Yday="$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s)" -F"[ ,]" \
'{ Mdate=$(NF-1)" "$NF;
dMepoch="date -d""\""Mdate"\""" +%s";
dMepoch |getline Mdate; close(dMepoch)
}
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}
{print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit
}'
OK
説明する:
- まず、
$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s)
昨日の日付をこの形式にインポートしてから、それを次のように変換します。Y-m-d 00:00:00
$(date -d '-1day' '+%Y-%m-%d 00:00:00')
エポック時間という変数に割り当てられますYday
。 - では、
F"[ ,]"
フィールド区切り文字を次のように定義します。斑点そしてスペース。 - では、
Mdate=$(NF-1)" "$NF;
フィールド区切り文字に基づいて、最後の2つのフィールドを次の変数のみをMdate
含む変数に入れます。日付、その後。 - では、
dMepoch="date -d""\""Mdate"\""" +%s";
シェルコマンドをに設定し、date -d""\""Mdate"\""" +%s
変数に割り当ててから前のコマンドを呼び出しますdMepoch
。dMepoch |getline Mdate;
パイプでgetlineを使用する次に、Mdate
渡された値の時代を取得し、同じ変数に保存します。Mdate
- 最後に、開いたコマンドを閉じる必要があるので、次のようにします。
close(dMepoch)
閉じます。
昨日の日付と、各行が読み取るエポックの各行の日付がありますnodestat
。awk
後で
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}
NR==1
、最初の行であり、変更時刻(に保存されたエポックMdate
)が昨日の日付(エポックYday
)より前であることを確認し、行にその日付が含まれていることを確認してから、フラグをnode mode : produce
設定して行を実行しますtru++
。awk
next
2行目は
print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit
同じ修正時間をブロックし、NR==2
一致を含め、1tru!=0
行目のすべての条件が満たされている場合は「OK」を印刷し、そうでない場合は3項条件で「NOT OK」を印刷しますprint (condition)?if_true:if_false
。exit
最初の行が条件を満たさないたびにここで使用され、最初の実行時にawk
「NOT OK」を印刷して終了します。これにより、「NOT OK」が繰り返されるのを防ぐことができます。