簡體   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