繁体   English   中英

jq - 循环通过 json object 并且只显示某些值

[英]jq - looping through json object and only displaying certain values

我目前正在学习如何使用jq 我有一个 json object 并且我可以使用jq循环和读取值,例如cat test.json | jq -r '.test' cat test.json | jq -r '.test' 但是,当我只想显示已outdateddeprecated = true但如果relase = never-update-appnever-upgrade-app从结果中省略的值时,我遇到了一些复杂性。 我正在尝试cat test.json | jq '.test | select(.[].outdated==true)' cat test.json | jq '.test | select(.[].outdated==true)' cat test.json | jq '.test | select(.[].outdated==true)'但这不会返回所需的结果。 这是否可以通过 jq 实现并以以下所需格式显示?

我想要的 output 如下图所示:

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

json:

{
    "test": [{
        "release": "myapp1",
        "Installed": {
            "version": "0.3.0",
            "appVersion": "v1.2.6"
        },
        "Latest": {
            "version": "",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": false
    }, {
        "release": "myapp2",
        "Installed": {
            "version": "6.5.13",
            "appVersion": "1.9.1"
        },
        "Latest": {
            "version": "",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": false
    }, {
        "release": "test-app",
        "Installed": {
            "version": "1.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "outdated": true,
        "deprecated": false
    }, {
        "release": "never-update-app",
        "Installed": {
            "version": "1.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "3.0.0",
            "appVersion": ""
        },
        "outdated": true,
        "deprecated": false
    }, {
        "release": "never-upgrade-app",
        "Installed": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": true
    }]
}

如何作用于数组中的每个元素

您在.test中有一个数组。 如果要提取该数组的各个元素以在过滤器的 rest 中使用,请使用.test[] 如果要处理它们但将结果保存在数组中,请使用.test|map(...)其中...是要应用于数组元素的过滤器。

如何过滤具有多个条件的对象

本问题所述,您可以将select()过滤器与多个条件一起使用。 因此,例如:

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        .release != "never-update-app" and
        .release != "never-upgrade-app"
    )'

如何组合非平凡过滤器

使用括号,例如,假设您想用startswith测试替换两个“never-”测试。 通过用括号包围管道,您可以隔离计算并获得真/假答案以组合在 boolean 表达式中。

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        (.release|startswith("never-")|not)
    )'

如何在表格中格式化结果

我认为这个关于在表格中格式化结果的答案可能就足够了。 如果您有更具体的需求,我认为您可能希望将其拆分为一个单独的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM