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

Jef*_*ang 48 json key object export-to-csv jq

我如何让jq像这样采取json:

{
  "host1": { "ip": "10.1.2.3" },
  "host2": { "ip": "10.1.2.2" },
  "host3": { "ip": "10.1.18.1" }
}
Run Code Online (Sandbox Code Playgroud)

并生成此输出:

host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1
Run Code Online (Sandbox Code Playgroud)

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

pea*_*eak 77

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

jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"' 
Run Code Online (Sandbox Code Playgroud)

keys按排序顺序生成密钥名称; 如果您想按原始顺序使用它们,请使用keys_unsorted.

另一种以原始顺序生成密钥的替代方案是:

jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'
Run Code Online (Sandbox Code Playgroud)

CSV和TSV输出

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

jq -r 'to_entries[] | [.key, .value.ip] | @tsv'
Run Code Online (Sandbox Code Playgroud)

生产:

host1   10.1.2.3
host2   10.1.2.2
host3   10.1.18.1
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是有道理的,这是一个很好的问题,但请原谅我说,你自己可以很容易地回答这个问题,因为答案只是忽略潜在的并发症。也就是说,正常的方法是引用带空格的字符串,等等。 (2认同)
  • @Saichovsky - 我已经检查过它在 jq 1.4、1.5 和 1.6 中是否有效。如果您使用的是 jq 1.3,则必须编写`.["id address"]`,就像在正常情况下必须做的那样。 (2认同)

Via*_*lav 30

遇到非常优雅的解决方案

jq 'with_entries(.value |= .ip)'
Run Code Online (Sandbox Code Playgroud)

哪个输出

{
  "host1": "10.1.2.3",
  "host2": "10.1.2.2",
  "host3": "10.1.18.1"
}
Run Code Online (Sandbox Code Playgroud)

以下是要播放的jqplay片段:https://jqplay.org/s/Jb_fnBveMQ

该函数with_entries将对象列表中的每个对象转换为Key/Value-pair,因此我们可以通过使用更新运算符来访问.key.value分别.value使用该字段更新(覆盖)每个KV项目.ip|=

  • 这个解就是准确的答案。所选解决方案具有一些有用的附加功能,但不够精确或优雅。您可能需要添加简洁的解释和完整的命令。 (3认同)
  • 高超!很多时候我使用“to_entries[]”只是因为我不知道这个。 (2认同)