我有逗号分隔的字段,如下所示,这是命令的输出nodestat
。
node mode : produce , modify time: 2014-11-22 04:23:28
node status: active , modify time: 2014-11-22 04:23:28
如果出现以下所有条件,我想打印“OK”:
- “节点模式:产生”(第一行第一列)和
- “节点状态:活动”(第二行第一列)和
- 修改时间小于昨天时间。(第一行第二列)
否则打印“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++
并运行awk
该next
行,所以在 中
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_false
。exit
每当第一行不满足条件时就用在这里,并且在第一次运行时将awk
打印“NOT OK”并退出,这将防止重复“NOT OK”。