繁体   English   中英

jq:打印对象中每个条目的键和值

[英]jq: print key and value for each entry in an object

我如何让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

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

要将顶级键作为流获取,您可以使用内置功能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)"'

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

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

哪些输出

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

这是要使用的 jqplay 片段: https ://jqplay.org/s/Jb_fnBveMQ

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

暂无
暂无

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

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