jq shell脚本:将迭代内容聚合到json主体中

时间:2018-07-02 07:01:07

标签: shell jq

我正在创建一个shell脚本。

我需要根据key-value列表内容创建一个curl json主体。通过awk拆分此内容,生成两列表:

KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $f)

示例输出:

VAR1 VAL1
VAR2 VAL2
VAR3 VAL3

因此,此表在一段时间的迭代中进行了迭代,并且每个keyvalue都被拆分了:

echo "$KVS_VARIABLES" | while read -r kv
  do
    key=$(echo $kv | awk '{print $1}')
    value=$(echo $kv | awk '{print $2}')
  done

因此,我需要某种方式将这些内容聚合到json文档中,以便使用curl发送出去:

curl -k \
  -X PUT \
  -d @- \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  "$SERVER_URL/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_ID" <<-EOF
  {
    "kind": "Secret",
    "apiVersion": "v1",
    "metadata": {
      "name": "$SECRET_ID"
    },
    "stringData": {
      "$key": "$value"     <<<<<<<<<<<<<(1)>>>>>>>>>>>>>>
    }
  }
EOF

因此,在<<<<<<<<<<<<<(1)>>>>>>>>>>>>>>上,我需要汇总每个keyvalue传播。

因此,在这种情况下,我需要生成:

"VAR1": "VAL1",
"VAR2": "VAL2",
"VAR3": "VAL3"

,然后将其插入“ stringData”中:

{
    "kind": "Secret",
    "apiVersion": "v1",
    "metadata": {
      "name": "$SECRET_ID"
    },
    "stringData": {
       <<<<<<<<<<<<<(1)>>>>>>>>>>>>>>
    }
}

所以,毕竟:

{
    "kind": "Secret",
    "apiVersion": "v1",
    "metadata": {
      "name": "$SECRET_ID"
    },
    "stringData": {
       "VAR1": "VAL1",
       "VAR2": "VAL2",
       "VAR3": "VAL3"
    }
}

jq已安装。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不需要在while循环内需要awk语句,而只需读取read命令本身内的键值对。

也将awk输出存储在变量中,然后进行解析是一种反模式。您可以使用外壳程序提供的进程替换功能,< <()部分将使命令输出像在文件中一样(或)使用here字符串

json=$(cat <<-EOF
{
    "kind": "Secret",
    "apiVersion": "v1",
    "metadata": {
      "name": "$SECRET_ID"
    },
    "stringData": {
    }
}
EOF
)

while read -r key value; do
    json=$(echo "$json" | jq ".stringData += { \"$key\" : \"$value\" }")
done< <(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $f)

您现在可以将"$json"中的变量curl用作

curl -k \
  -X PUT \
  -d @- \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  "$SERVER_URL/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_ID" <<<"$json"