编写Awk命令检查nodestat输出的多条件状态
解决方案
没问题,我来帮你搞定这个Awk命令,完全贴合你的需求。先直接上可运行的代码,再一步步拆解逻辑:
BEGIN { # 获取昨日0点整的Unix时间戳,作为时间判断的基准 "date -d 'yesterday 00:00:00' +%s" | getline yesterday_ts close("date -d 'yesterday 00:00:00' +%s") ok = 1 # 默认状态为符合所有条件 } # 处理第一行数据 NR == 1 { split($0, fields, /,/) # 按逗号拆分每行内容到数组 # 检查第一列是否匹配指定文本 if (fields[1] != "node mode : produce") { ok = 0 } # 将第二列的时间字符串转为Unix时间戳(方便数字对比) cmd = "date -d \"" fields[2] "\" +%s" cmd | getline current_ts close(cmd) # 时间对比:如果当前时间不早于昨日0点,标记为不符合 if (current_ts >= yesterday_ts) { ok = 0 } } # 处理第二行数据 NR == 2 { split($0, fields, /,/) if (fields[1] != "node status: active") { ok = 0 } cmd = "date -d \"" fields[2] "\" +%s" cmd | getline current_ts close(cmd) if (current_ts >= yesterday_ts) { ok = 0 } } # 最终输出结果 END { print ok ? "OK" : "NOT OK" }
关键逻辑拆解
- 时间基准处理:在
BEGIN块里调用系统date命令,拿到昨日0点的Unix时间戳——这样不管当前是几点,都能准确判断目标时间是否属于"昨日及之前",而不是简单的24小时前。 - 字段拆分:用
split函数把每行的逗号分隔内容拆成数组,fields[1]对应第一列,fields[2]对应第二列,方便提取和判断。 - 时间对比:Unix时间戳是数字形式(从1970年至今的秒数),直接用大小对比就能快速判断时间先后。只要当前行的时间戳大于等于昨日0点的戳,就说明不满足"早于昨日"的条件。
- 资源清理:每次调用
date命令后用close(cmd)关闭管道,避免Awk占用过多系统资源。
使用方式
如果你的nodestat输出已经保存到文件(比如node_status.txt),可以这样运行:
awk -f check_node.awk node_status.txt
也可以直接管道对接nodestat命令,适合临时检查:
nodestat | awk 'BEGIN { "date -d '\''yesterday 00:00:00'\'' +%s" | getline yesterday_ts; close("date -d '\''yesterday 00:00:00'\'' +%s"); ok=1 } NR==1 { split($0,fields,/,/); if(fields[1]!="node mode : produce") ok=0; cmd="date -d \""fields[2]"\" +%s"; cmd|getline ts; close(cmd); if(ts>=yesterday_ts) ok=0 } NR==2 { split($0,fields,/,/); if(fields[1]!="node status: active") ok=0; cmd="date -d \""fields[2]"\" +%s"; cmd|getline ts; close(cmd); if(ts>=yesterday_ts) ok=0 } END { print ok?"OK":"NOT OK" }'
小提醒
如果nodestat输出的第二列时间格式比较特殊(比如不是系统date能直接识别的格式),你可能需要调整date -d的参数,或者在Awk里手动解析日期字符串生成时间戳。一般常见的格式(如YYYY-MM-DD HH:MM:SS、MM/DD/YYYY)都能被date正常识别。
内容的提问来源于stack exchange,提问作者user3548033
相关产品推荐
相关产品推荐

