我有一个 JSON 对象,如下所示:
{
"1": {
"available_memory": 1086419656.0,
"available_memory_no_overbooking": 1086419656.0,
"conns": 1.0
},
"2": {
"available_memory": 108641236.0,
"available_memory_no_overbooking": 10861216.0,
"conns": 2.0
}
}
我想检索每个对象 ID 的“conns”属性的值。我是 jq 的新人,我找不到明确的例子。
我已经尝试过以下方法:
echo "$OUTPUT" | jq -r .[].conns
它返回 conns 的所有值,但这不是我需要的。预计的输出将是:
1 1.0
2 2.0
有任何想法吗?
答案1
$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1 1
2 2
似乎 jq 将 1.0 转换为 1,将 2.0 转换为 2。为了清楚起见,更改输入:
$ cat file.json
{
"1a": {
"available_memory": 1086419656.0,
"available_memory_no_overbooking": 1086419656.0,
"conns": 1.1
},
"2b": {
"available_memory": 108641236.0,
"available_memory_no_overbooking": 10861216.0,
"conns": 2.2
}
}
$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1a 1.1
2b 2.2
参考文献:
答案2
替代解决方案(jtc
)使用一些标准 cli 来简化提问:
bash $ echo $OUTPUT | jtc -rl -w'[+0]' -w'[+0][conns]' | sed 's/: {.*//g; s/^"conns"://' | xargs -n2
1 1.0
2 2.0
bash $
jtc(与 jq 不同)是一个实用程序,它将其功能仅限于 json 操作(因此其界面非常简单),但是在 JSON 数据模型之外操作文章被卸载到外部 unix 工具
编辑:新版本jtc
支持更简单的解决方案:
bash $ jtc -w'<conns>l:<con>v[-1]<key>k' -T '"{key} {con}"' -qq <<<$OUTPUT
1 1.0
2 2.0
bash $