如何使用JQ正则匹配筛选含wkn的host_name并统计数量
问题原因及正确JQ写法
错误写法分析
- 第一种写法错误:
==是精确相等匹配运算符,不支持通配符匹配逻辑,代码中的"*wkn01.*"会被当做普通字符串做全量匹配,自然无符合条件的结果。 - 第二种写法错误:正则表达式语法不符合规范,
*是重复量词,必须搭配前置匹配字符使用,直接以*开头会触发语法报错。同时你要匹配的是所有包含wkn的主机名,不需要限定01后缀。
额外注意:你原curl命令中的-sH参数错误,-H参数需要后接请求头键值对,如果你不需要自定义请求头,只需保留静默模式参数-s即可。
正确写法
1. 筛选出所有主机名含wkn的主机条目
curl -s http://10.10.0.10:8080/api/v1/clusters/test/hosts?fields=Hosts/host_name,Hosts/ip \ | jq '.items[] | select(.Hosts.host_name | test("wkn"))'
2. 直接统计符合条件的主机数量
如果接口返回结构是包裹在items数组中的标准格式,用以下命令:
curl -s http://10.10.0.10:8080/api/v1/clusters/test/hosts?fields=Hosts/host_name,Hosts/ip \ | jq '[.items[] | select(.Hosts.host_name | test("wkn"))] | length'
如果接口返回的是你示例中给出的多个独立JSON对象的格式,给jq增加-s参数合并输入流即可:
curl -s http://10.10.0.10:8080/api/v1/clusters/test/hosts?fields=Hosts/host_name,Hosts/ip \ | jq -s '[.[] | select(.Hosts.host_name | test("wkn"))] | length'
执行上述命令会直接输出符合条件的主机数量,你的示例数据会返回2。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

