jq-在json对象中循环并仅显示某些值

jq-在json对象中循环并仅显示某些值,json,jq,Json,Jq,我目前正在学习如何使用jq。我有一个json对象,我能够使用jq循环并读取值,比如cat test.json | jq-r'.test'。然而,当我只想显示那些过时的或不推荐的=true但如果relase=从不更新应用程序或从不升级应用程序则从结果中删除的值时,我遇到了一些复杂性。我正在尝试cat test.json | jq'.test | select(.[].oplated==true),但这并没有返回所需的结果。这是否可以通过jq实现,并以下面所需的格式显示 我想要的输出如下所示: Re

我目前正在学习如何使用
jq
。我有一个json对象,我能够使用
jq
循环并读取值,比如
cat test.json | jq-r'.test'
。然而,当我只想显示那些
过时的
不推荐的
=
true
但如果
relase
=
从不更新应用程序
从不升级应用程序
则从结果中删除的值时,我遇到了一些复杂性。我正在尝试
cat test.json | jq'.test | select(.[].oplated==true)
,但这并没有返回所需的结果。这是否可以通过jq实现,并以下面所需的格式显示

我想要的输出如下所示:

Release Name                                             Installed    Latest    Old      Deprecated
test-app                                                 1.0.0        2.0.0     true     false  
json:

如何作用于数组中的每个元素 您在
.test
中有一个数组。如果要提取该数组中的单个元素以用于过滤器的其余部分,请使用
.test[]
。如果要处理它们但将结果保留在数组中,请使用
。test | map(…)
其中
是要应用于数组元素的过滤器

如何过滤具有多个条件的对象 如上所述,您可以在多个条件下使用
select()
过滤器。例如:

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        .release != "never-update-app" and
        .release != "never-upgrade-app"
    )'
如何组合非平凡过滤器 用括号!例如,假设您想用
startswith
测试替换两个“从不”测试。通过用括号包围管道,您隔离了计算,只需得到真/假答案,并将其组合到布尔表达式中

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        (.release|startswith("never-")|not)
    )'
如何在表格中格式化结果
我认为这个答案可能就足够了。如果您有更具体的需求,我想您可能希望将其拆分为一个单独的问题。

输入无效,第行缺少逗号51@BenjaminW. 现在更正了。谢谢可能重复:这里唯一不同的是您想要有多个条件,并且可能想要格式化输出。格式化是问题的一部分吗?这里有一个问题涉及到多个条件:@Weeble谢谢你给我指出这一点。是的,格式化也是其中的一部分。我可以在我的博文中提到这一点。如果
.release
字段发生变化,并且我希望应用通配符或
startswith
。我可以这样做
.release | startswith(“never”)
,但我如何应用或添加它以符合您的答案呢?啊,我在匆忙使用布尔表达式时犯了一个错误。我已经对其进行了更新,并添加了进一步修改的示例。希望这足以让你走上正确的方向。
jq '.test[]|
    select(
        (.outdated or .deprecated) and
        (.release|startswith("never-")|not)
    )'