这是后续这个问题几天前我问过。
假设我有来自网络服务器的输出
{"status":"OK","result":{"string1":{"variable":0},"string2":[{"id":"XXXXX:XXXXX","tier":"normal","latitude":"01.XXXXX","longitude":"02.XXXXX"},{"id":"XXXXX:XXXXX","tier":"normal","latitude":"01.XXXXX","longitude":"02.XXXXX"},{"id":"XXXXX:XXXXX,"tier":"special","latitude":"01.XXXXX","longitude":"02.XXXXX"},{"id":"XXXXX:XXXXX","tier":"normal","latitude":"01.XXXXX","longitude":"02.XXXXX"}]}}
另存为response.json
并且只需要“ id
”作为输出。我使用jq -r '.result.string2[].id' response.json
.
现在我的问题是,如何设置条件,以便 jq 只输出“ id
” if tier:"special"
?
谢谢!
以下是我尝试过但只出现错误的一些选项:
jq -r ' |.result.string2[].id.tier select(== "special") | .id ' responses.json
jq -r '.result.string2[].id | select( has("tier.special") )' responses.json
答案1
jq -r '.result.string2[] | select(.tier == "special").id' responses.json
.id
或者,没有直接应用的快捷方式select()
:
jq -r '.result.string2[] | select(.tier == "special") | .id' responses.json
展开string2
数组,选出具有正确的tier
with值的一个或多个条目select()
,然后选出id
其中的 。
为此,您可以一点一点地构建表达式并在示例文档上运行多次。首先.result
查看返回的内容,然后.result.string2
等。这样,您会立即注意到您尝试|
在表达式中放置第一个是行不通的,并且.result.string2[].id
会产生一个不包含的列表tier
(因此您不能使用select()
它来过滤tier
)。
您还会注意到,问题中显示的示例文档在其值之一后面缺少双引号。