使用Mikefarah's yq结合正则表达式过滤节点条目及日期过滤需求
Mikefarah's yq结合正则表达式过滤节点条目及日期过滤需求
我来帮你一步步梳理解决思路,先搞定节点名的正则匹配问题,再扩展日期过滤的需求~
一、先解决节点名正则匹配的问题
你之前的命令没输出,是因为上下文路径搞错了:当你用.nodes进入节点集合后,当前上下文已经是整个nodes的键值映射了,此时再调用.nodes就找不到对应的路径,导致test返回false,自然没有结果。
正确的做法是用with_entries遍历每个节点的键值对,针对**节点名(键)**做正则匹配:
yq_linux_amd64 '.nodes | with_entries(select(.key | test("^(cpu|gpu)\\d+$")))' sample.sls
这个命令会筛选出所有键(比如cpu042、gpu001)符合^(cpu|gpu)\d+$正则的条目,运行后会输出你想要的两个节点:
cpu042: created: 20230123 hardware: mem: 503 cpu: 128 gpu001: created: 20150123 hardware: mem: 503 cpu: 128
二、扩展日期过滤需求
接下来我们加上日期筛选逻辑,这里给你几个常见场景的示例,你可以根据实际需求调整:
场景1:保留未被删除(无deleted字段)且created日期≥20150101的节点
yq_linux_amd64 '.nodes | with_entries(select( .key | test("^(cpu|gpu)\\d+$") and .value.created >= "20150101" and (.value | has("deleted") | not) ))' sample.sls
运行后会保留cpu042和gpu001,因为它们都没有deleted字段且创建日期符合要求。
场景2:保留created在20140101-20240101之间,且删除日期≥20220121(或未删除)的节点
yq_linux_amd64 '.nodes | with_entries(select( .key | test("^(cpu|gpu)\\d+$") and (.value.created >= "20140101" and .value.created <= "20240101") and (has("deleted") | not or .value.deleted >= "20220121") ))' sample.sls
这个命令会自动排除节点名不符合的node001,同时保留满足日期条件的目标节点。
关键知识点小总结
with_entries:专门用于处理键值对映射的工具,适合遍历筛选节点条目.key:在with_entries上下文里,指代当前条目的键(也就是节点名).value:指代当前条目的值(节点的详细信息,比如created、hardware等)has("deleted"):检查当前节点是否存在deleted字段- 日期比较:因为你的日期是纯数字字符串格式(比如
20230123),直接用字符串比较即可,yq会按字典序正确处理这种格式的日期。
备注:内容来源于stack exchange,提问作者Yann Sagon




