【问题标题】:jq: print key and value for each entry in an objectjq:打印对象中每个条目的键和值
【发布时间】:2016-03-17 12:48:15
【问题描述】:

如何让 jq 像这样获取 json:

{
  "host1": { "ip": "10.1.2.3" },
  "host2": { "ip": "10.1.2.2" },
  "host3": { "ip": "10.1.18.1" }
}

并生成此输出:

host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1

我对格式不感兴趣,我只是不知道如何访问键名和值。

【问题讨论】:

    标签: json object key export-to-csv jq


    【解决方案1】:

    要将顶级密钥作为流获取,您可以使用built-in function keys[]。因此,解决您的特定问题的一种方法是:

    jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"' 
    

    keys 按排序顺序生成键名;如果您希望它们按原始顺序排列,请使用keys_unsorted

    另一种按原始顺序生成键的方法是:

    jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'
    

    CSV 和 TSV 输出

    @csv 和 @tsv 过滤器在这里可能也值得考虑,例如

    jq -r 'to_entries[] | [.key, .value.ip] | @tsv'
    

    产生:

    host1   10.1.2.3
    host2   10.1.2.2
    host3   10.1.18.1
    

    嵌入对象

    如果感兴趣的键像以下示例中那样嵌入,则必须按照所示行修改 jq 过滤器。

    输入:

    {
      "myhosts": {
        "host1": { "ip": "10.1.2.3" },
        "host2": { "ip": "10.1.2.2" },
        "host3": { "ip": "10.1.18.1" }
      }
    }
    

    修改:

    jq -r '.myhosts | keys[] as $k | "\($k), \(.[$k] | .ip)"'
    

    【讨论】:

    • 假设“.ip”键中有空格,例如,“ip 地址”,如果您处于引号字符串的第三级,如何转义键周围的引号,如果这有意义吗?
    • 是的,这是有道理的,而且这是一个很好的问题,但请原谅我这么说,您可以很容易地自己回答,因为答案只是忽略潜在的并发症。也就是说,正常的方法是用空格引用字符串,等等。
    • 我试过没有成功。尝试转义引号,但没有成功,因此提出了问题。
    • @Saichovsky - 我已经检查过它在 jq 1.4、1.5 和 1.6 中有效。如果您使用的是 jq 1.3,则必须写 .["id address"],因为无论如何您都必须这样做。
    【解决方案2】:

    遇到了非常优雅的解决方案

    jq 'with_entries(.value |= .ip)'
    

    哪些输出

    {
      "host1": "10.1.2.3",
      "host2": "10.1.2.2",
      "host3": "10.1.18.1"
    }
    

    这里是 jqplay sn-p 玩:https://jqplay.org/s/Jb_fnBveMQ

    函数with_entries将对象列表中的每个对象转换为键/值对,因此我们可以分别访问.key.value,我们正在更新(覆盖)每个KV项.value使用更新 |= 运算符,使用字段 .ip

    【讨论】:

    • 这个解决方案是准确的答案。所选的解决方案有一些有用但不准确或优雅的附加功能。您可能需要添加简明的解释和完整的命令。
    • 太棒了!很多时候我使用“to_entries[]”只是因为我不知道这个。
    • 天哪!有时更多的页面滚动可以提供最好的解决方案,而不是首先甚至被接受为“解决方案”。非常感谢这个答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多