awk コマンドは、1 行目の最初のフィールドと 1 行目の 2 番目のフィールドの状態を確認します。

awk コマンドは、1 行目の最初のフィールドと 1 行目の 2 番目のフィールドの状態を確認します。

以下のようにカンマで区切られたフィールドがあります。これはコマンドの出力ですnodestat

node mode  : produce ,  modify time: 2014-11-22 04:23:28
node status: active  ,  modify time: 2014-11-22 04:23:28

以下の条件がすべて発生した場合は「OK」を印刷したいと思います。

  1. 「ノードモード:作成」(最初の行、最初の列)と
  2. 「ノード状態:アクティブ」(2行目、1列目)と
  3. 修正時間が昨日より短い。 (最初の行、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変数に割り当ててから前のコマンドを呼び出しますdMepochdMepoch |getline Mdate;パイプでgetlineを使用する次に、Mdate渡された値の時代を取得し、同じ変数に保存します。Mdate
  • 最後に、開いたコマンドを閉じる必要があるので、次のようにします。close(dMepoch)閉じます。

昨日の日付と、各行が読み取るエポックの各行の日付がありますnodestatawk後で

  • $0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}NR==1、最初の行であり、変更時刻(に保存されたエポックMdate)が昨日の日付(エポックYday)より前であることを確認し、行にその日付が含まれていることを確認してから、フラグをnode mode : produce設定して行を実行しますtru++awknext

  • 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_falseexit最初の行が条件を満たさないたびにここで使用され、最初の実行時にawk「NOT OK」を印刷して終了します。これにより、「NOT OK」が繰り返されるのを防ぐことができます。

関連情報