awk 命令检查第一行的第一个字段和第一行的第二个字段的条件

awk 命令检查第一行的第一个字段和第一行的第二个字段的条件

我有逗号分隔的字段,如下所示,这是命令的输出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. “节点状态:活动”(第二行第一列)和
  3. 修改时间小于昨天时间。(第一行第二列)

否则打印“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;,基于字段分隔符,我们将最后两个字段放入一个名为的变量中,Mdate该变量仅包含日期, 然后;
  • 在 中dMepoch="date -d""\""Mdate"\""" +%s";,我们将 shell 命令设置为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++并运行awknext行,所以

  • 在 中print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit,我们在第二行中阻塞相同的修改时间NR==2并包含我们的匹配项,并且如果第一行中满足所有条件tru!=0,则打印“OK”,否则通过三元条件打印“NOT OK” print (condition)?if_true:if_falseexit每当第一行不满足条件时就用在这里,并且在第一次运行时将awk打印“NOT OK”并退出,这将防止重复“NOT OK”。

相关内容