我如何获得 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
我对格式不感兴趣,只是不知道如何访问键名和值。
最佳答案
要将顶级密钥作为流获取,可以使用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)"'