jq使用中通过select结合contains匹配字符串时遇到问题
jq 嵌套结构字符串筛选调整方案
踩坑原因梳理
- 路径与测试结构不匹配:你当前使用的命令引用了
.results、.series、.values三个嵌套字段,但给出的测试样本是两个独立的流式JSON值(第一个是字符串数组["user","admin"],第二个是二维数组[["tdonn", true]]),样本内不存在上述键名,执行时自然无法匹配到目标内容。 - 筛选逻辑层级错位:原命令
select(.values[] | contains("tdon"))[]的写法,会在匹配到包含目标子串的数组行后,把行内所有元素(包括布尔值true)全部展开输出,无法精准只提取目标字符串。
适配测试样本的可直接运行命令
如果目标是遍历所有流式输入的JSON内容,提取包含tdon子串的字符串,直接执行以下命令即可输出tdonn:
jq -r '.. | strings | select(contains("tdon"))'
适配真实嵌套结构的修正写法
如果实际处理的是带results、series、values键的嵌套结构(比如常见的时序查询返回格式),可以将命令调整为:
jq -r '.results[].series[].values[] | .[] | select(contains("tdon"))'
这个写法会逐层展开values内的二维数组,对每个元素做子串匹配,最终只输出满足匹配条件的字符串,不会连带输出布尔值等其他类型的内容。
匹配小技巧:如果简单的
contains无法满足判断需求,可以替换为test("tdon")做正则匹配,适配更复杂的字符串判断场景。
内容的提问来源于stack exchange,提问作者Tom Donnly
相关产品推荐
相关产品推荐

