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
我对格式不感兴趣,我只是不知道如何访问键名和值。
要获取顶级密钥作为流,您可以使用 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)"'
遇到了非常优雅的解决方案
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
,我们正在更新(覆盖) 每个 KV-item .value
字段 .ip
通过使用更新 |=
operator
如何让 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)"'
遇到了非常优雅的解决方案
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
,我们正在更新(覆盖) 每个 KV-item .value
字段 .ip
通过使用更新 |=
operator