一尘不染

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

json

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

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


阅读 336

收藏
2020-07-27

共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)"'
2020-07-27