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

时间:2015-12-11 14:58:10

标签: json jq

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

我对格式化不感兴趣,我只是无法弄清楚如何访问密钥名称和值。

2 个答案:

答案 0 :(得分:67)

要将顶级键作为流,您可以使用键[]。因此,针对您的特定问题的一个解决方案是:

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

答案 1 :(得分:18)

遇到非常优雅的解决方案

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-pair,因此我们可以分别访问.key.value,我们每次都更新(覆盖)使用更新.value运算符

,使用字段.ip的KV项|=