如何为curl+jq过滤命令添加OS字段的包含匹配条件?
问题:为curl+jq命令添加基于contains的OS字段包含过滤
我当前使用以下curl+jq命令可正常执行,现在需要新增一个过滤条件——用contains包含匹配的方式,筛选出OS字段包含指定字符串的设备:
curl -H "Accept: application/json; indent=4" -H "Authorization: Token $token" "$url_devices" -k | jq -r --arg device "$device" '.results[] | select(.cluster.name == $cluster) | .primary_ip.address'
我尝试了精确匹配的写法,但无法正常工作:
curl -H "Accept: application/json; indent=4" -H "Authorization: Token $token" "$url_devices" -k | jq -r --arg device "$device" '.results[] | select(.cluster.name == $cluster AND .cluster.os == $os) | .primary_ip.address'
解决方案
要实现包含匹配,需要将精确匹配的逻辑替换为jq的contains()函数,同时修正变量传递和语法问题:
基础包含匹配命令
curl -H "Accept: application/json; indent=4" -H "Authorization: Token $token" "$url_devices" -k | jq -r --arg cluster "$cluster" --arg os "$os" '.results[] | select(.cluster.name == $cluster and .cluster.os | contains($os)) | .primary_ip.address'
关键修改点:
- 补充
--arg cluster "$cluster"和--arg os "$os"参数,确保jq能正确获取这两个外部变量(原命令遗漏了这两个参数的传递) - 将
.cluster.os == $os改为.cluster.os | contains($os),实现判断.cluster.os字段是否包含$os变量指定的字符串 - jq标准逻辑与使用小写
and,而非大写AND
可选:忽略大小写的包含匹配
如果需要忽略OS字符串的大小写差异,可以用ascii_downcase统一转换为小写后再匹配:
curl -H "Accept: application/json; indent=4" -H "Authorization: Token $token" "$url_devices" -k | jq -r --arg cluster "$cluster" --arg os "$os" '.results[] | select(.cluster.name == $cluster and (.cluster.os | ascii_downcase) | contains($os | ascii_downcase)) | .primary_ip.address'
内容的提问来源于stack exchange,提问作者Tonis
相关产品推荐
相关产品推荐

