オブジェクト内のすべてのキーを出力するためのソリューションを備えたこのQ / Aを見つけました。
jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"'
私の場合、上記を実行したいのですが、サブオブジェクトに対して:
jq -r '.connections keys[] as $k | "\($k), \(.[$k] | .ip)"'
これを行うための適切な構文は何ですか?
オブジェクト内のすべてのキーを出力するためのソリューションを備えたこのQ / Aを見つけました。
jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"'
私の場合、上記を実行したいのですが、サブオブジェクトに対して:
jq -r '.connections keys[] as $k | "\($k), \(.[$k] | .ip)"'
これを行うための適切な構文は何ですか?
回答:
単にkeys
関数にパイプします:
サンプルinput.json
:
{
"connections": {
"host1": { "ip": "10.1.2.3" },
"host2": { "ip": "10.1.2.2" },
"host3": { "ip": "10.1.18.1" }
}
}
jq -r '.connections | keys[] as $k | "\($k), \(.[$k] | .ip)"' input.json
出力:
host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1
keys
キー名をソート順に生成します。元の順序でキー名が必要な場合は、keys_unsorted
」を使用します。したがって、OPはそれを認識しており、keys
意識的に選択しています。
変数をエクスポートするためのより一般的なbash関数(内挿あり):
#
#------------------------------------------------------------------------------
# usage example:
# doExportJsonSectionVars cnf/env/dev.env.json '.env.virtual.docker.spark_base'
#------------------------------------------------------------------------------
doExportJsonSectionVars(){
json_file="$1"
shift 1;
test -f "$json_file" || echo "the json_file: $json_file does not exist !!! Nothing to do" && exit 1
section="$1"
test -z "$section" && echo "the section in doExportJsonSectionVars is empty !!! nothing to do !!!" && exit 1
shift 1;
while read -r l ; do
eval $l ;
done < <(cat "$json_file"| jq -r "$section"'|keys_unsorted[] as $key|"export \($key)=\(.[$key])"')
}
データの例
cat cnf/env/dev.env.json
{
"env": {
"ENV_TYPE": "dev",
"physical": {
"var_name": "var_value"
},
"virtual": {
"docker": {
"spark_base": {
"SPARK_HOME": "/opt/spark"
, "SPARK_CONF": "$SPARK_HOME/conf"
}
, "spark_master": {
"var_name": "var_value"
}
, "spark_worker": {
"var_name": "var_value"
}
}
, "var_name": "var_value"
}
}
}
keys
キーをソートするので、ソートkeys_unsorted
しないことを指摘する価値があります。