bash环境下jq使用CONTAINS过滤时带空格变量不生效问题求助
问题根因
你遇到的问题本质是对jq的contains函数传参逻辑理解有误:
- 直接写
contains("10.32.0.4:8055", "10.32.0.7:8055")时,是给contains传入了两个独立的字符串参数,contains会判断输入字符串是否包含任意一个参数,所以能匹配到两条结果。 - 把两个搜索词用空格拼接成一个变量传入时,
contains($EXPRSTRSEARCH)是把整个带空格的字符串当成单个匹配条件,要找的是expr字段里同时存在10.32.0.4:8055 10.32.0.7:8055这一整串内容的记录,自然没有匹配结果。
解决方案
你只需要在jq内部先把传入的空格分隔的搜索词拆成数组,再判断expr是否匹配数组内任意一个元素即可,命令如下:
exprStrSearch="10.32.0.4:8055 10.32.0.7:8055" echo "${_metadatadashjson}" | jq -r --arg EXPRSTRSEARCH "$exprStrSearch" ' # 将空格分隔的搜索词拆分为数组 ($EXPRSTRSEARCH | split(" ")) as $search_list | .dashboard.panels[] | select(any(.targets[].expr; contains($search_list[]))) | .targets[].expr '
执行后会输出两条匹配的expr记录,和你硬编码参数的执行结果一致。
如果后续你的搜索关键词本身包含空格,可以自定义分隔符(比如用英文逗号拼接搜索词exprStrSearch="关键词1,关键词 2"),把代码里的split(" ")改成split(",")即可适配。
内容的提问来源于stack exchange,提问作者user3008410
相关产品推荐
相关产品推荐

