简体   繁体   English

在jq中返回键/值对

[英]Return key/value pairs in jq

I have the following json output (generated by ansible) and a seemingly easy task of pulling a few key/value pairs out with jq . 我有以下json输出(由ansible生成)和一个看似简单的任务,它通过jq提取了一些键/值对。 However, I can't seem to get the output I want. 但是,我似乎无法获得所需的输出。

{
"custom_stats": {}, 
"plays": [
    {
        "play": {
            "id": "001dd8b7-1cca-07c6-2280-00000000043a", 
            "name": "Ansible Ad-Hoc"
        }, 
        "tasks": [
            {
                "hosts": {
                    "hostname01-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname02-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname03-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname04-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname05-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname06-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname07-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname01-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname02-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname03-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname04-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname05-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname01-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname02-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname03-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname04-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname05-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname06-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }, 
                    "hostname07-con": {
                        "_ansible_no_log": false, 
                        "_ansible_verbose_always": true, 
                        "action": "debug", 
                        "changed": false, 
                        "hw_system_serial": "<SERIALNUMBER>"
                    }
                }, 
                "task": {
                    "id": "001dd8b7-1cca-07c6-2280-00000000043c", 
                    "name": "debug"
                }
            }
        ]
    }
], 
"stats": {
    "hostname01-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname02-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname03-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname04-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname05-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname06-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname07-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname01-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname02-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname03-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname04-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname05-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname01-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname02-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname03-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname04-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname05-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname06-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }, 
    "hostname07-con": {
        "changed": 0, 
        "failures": 0, 
        "ok": 1, 
        "skipped": 0, 
        "unreachable": 0
    }
}

} }

Basically I'd just like the key of the inner-most object along with its value for hw_system_serial , returned on the same line. 基本上,我只想将最里面的对象的键以及它的hw_system_serial值返回到同一行。 Something like this: 像这样:

hostname01-con: <SERIAL_NUMBER_1>
hostname02-con: <SERIAL_NUMBER_2>
etc

I feel like this should be trivial (I could have written a little ruby or python script in this time...), but try as I might I can't get it correct. 我觉得这应该是微不足道的(这次我可能写了一些ruby或python脚本...),但是尝试一下可能无法正确理解。 I've tried all sorts of things, but I either end up iterating over the list of hosts for every serial number or returning two separate lists (one hosts and one serial numbers). 我已经尝试了各种各样的方法,但是最后要么遍历每个序列号的主机列表,要么返回两个单独的列表(一个主机和一个序列号)。

For example, this: 例如,这:

.plays[].tasks[].hosts | keys as $hosts | .[].hw_system_serial as $serial | $hosts | join(": ") + $serial

returns a list of every host name on a single line followed by one serial number. 返回一行中每个主机名的列表,后跟一个序列号。

I think it will work if I can convert $serial to an array, but my attempts to use split() have also failed (eg $serial | split("\\r") returns a list of single-item arrays rather than an array of items). 认为 ,如果我可以将$serial转换$serial数组,则可以使用,但是我使用split()尝试也失败了(例如, $serial | split("\\r")返回单项数组而不是数组的列表)项)。

What am I missing here? 我在这里想念什么? I feel like jq should have an easy time with this (again, any scripting language with a JSON parser...), but is it just not the right tool for the job? 我觉得jq对此应该很轻松(再次,任何带有JSON解析器的脚本语言...),但这是否不是正确的工具?

Yes, this is feasible for jq tool: 是的,这对于jq工具是可行的:

jq -r '.plays[].tasks[].hosts | to_entries[] | "\(.key +": "+ .value.hw_system_serial)"' input.json

The output: 输出:

hostname01-con: <SERIALNUMBER>
hostname02-con: <SERIALNUMBER>
hostname03-con: <SERIALNUMBER>
hostname04-con: <SERIALNUMBER>
hostname05-con: <SERIALNUMBER>
hostname06-con: <SERIALNUMBER>
hostname07-con: <SERIALNUMBER>

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

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