jq如何合并兩個json文件的內容
如何把一個json文件的內容合并入另一個json文件盲厌。例如:
$ cat source.json
{
"expiretime": "36000",
"keyStore": "/tmp/kvs",
"logger": {
"default": {
"appenders": [
"console"
],
"level": "info"
}
},
"request-timeout": 30000
}
$ cat target.json
{
"expiretime": "6000",
"keyStore": "/tmp/kvs"
}
假設我們有上述兩個json文件聚请;我們的目標是把source.json里面的兩個字段logger和request-timeout合并到target.json文件里面。
$ jq --argjson s "$(<source.json)" '.logger = $s.logger | ."request-timeout" = $s."request-timeout"' target.json
{
"expiretime": "6000",
"keyStore": "/tmp/kvs",
"logger": {
"default": {
"appenders": [
"console"
],
"level": "info"
}
},
"request-timeout": 30000
}
幾點說明:
- --argson 把source.json的內如讀出來($(<filename)是shell的重定向)戳吝,然后以s作為alias惰瓜,后面直接使用$s引用即可跷敬。
- $s就是指的是source.json的內容
- 如果字段名含有特殊符號,例如"-"缀皱,那么需要用雙引號括起來,"request-timeout"动猬。
另一個例子唆鸡,把一個文件的內容全部插入到另一個文件的字段。
例如把target.json插入到source.json的.logger.config
字段:
$ jq --argjson s "$(<target.json)" '.logger.config = $s' source.json
{
"expiretime": "36000",
"keyStore": "/tmp/kvs",
"logger": {
"default": {
"appenders": [
"console"
],
"level": "info"
},
"config": {
"expiretime": "6000",
"keyStore": "/tmp/kvs"
}
},
"request-timeout": 30000
}
第三個例子枣察,source不是從文件中讀取争占,而是直接從變量中獲取
for (( i=0; i<5; i++ )); do
vm=$(echo "{}" | jq '.ip="'${VMIPS[$i]}'" | .hostname="'${VMNAMES[$i]}'"')
instance=$(echo $instance | jq --argjson s "$vm" '.vm[.vm|length]=$s')
done
echo $instance | jq .
一個instance包含多個vm,每一個vm有屬性主機名和IP地址序目;上述代碼含義是對每一個vm生成一個object對象臂痕,然后把object對象插入到instance的vm數組成員里面。