You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash遍历K8s Secret返回的map并格式化输出

遍历K8s Secret键值对并格式化输出

我通过kubectl get secret mySecret -o jsonpath='{.data}'获取到的Secret内容为:

map[first_password:ZXhhbXBsZQ0K second_password:ZXhhbXBsZQ0K third_password:ZXhhbXBsZQ0K]

希望将其格式化为每行显示键与对应值(空格分隔),行与行之间空一行的形式:

first_password ZXhhbXBsZQ0K

second_password ZXhhbXBsZQ0K

third_password ZXhhbXBsZQ0K

但当前使用的脚本仅能重复输出密码值,无法达到预期效果:

items=$(echo "$(kubectl get secret mySecret -o jsonpath='{.data}')" | jq -c -r '.[]')
for item in ${items[@]}; do
    echo $item
done

问题原因

原脚本中使用jq '.[]'仅提取了Secret的data字段中的值,完全忽略了键信息,因此循环只能输出值,无法得到键值对。


解决方案

方法1:用jq直接生成目标格式(推荐)

先让kubectl输出完整的JSON结构,再用jq遍历键值对并格式化:

# 输出键值对,行之间空一行
kubectl get secret mySecret -o json | jq -r '.data | to_entries[] | "\(.key) \(.value)\n"'

如果不需要行之间的空行,去掉末尾的\n即可:

kubectl get secret mySecret -o json | jq -r '.data | to_entries[] | "\(.key) \(.value)"'

方法2:直接处理原map格式输出

如果必须基于原jsonpath返回的map格式字符串处理,可通过sed和awk组合解析:

kubectl get secret mySecret -o jsonpath='{.data}' | sed 's/map\[//; s/\]//; s/ /\n/g' | awk -F: '{print $1, $2 "\n"}'

步骤说明:

  1. sed 's/map\[//; s/\]//:去掉字符串首尾的map[]包裹
  2. s/ /\n/g:将空格分隔的键值对拆分为每行一个
  3. awk -F: '{print $1, $2 "\n"}':用冒号分割键和值,输出键+值+空行

方法3:用kubectl jsonpath直接生成格式

无需额外工具,通过jsonpath的range遍历键和对应的值:

kubectl get secret mySecret -o jsonpath='{range .data.keys[]}{@} {.data[@]}{"\n\n"}{end}'

内容的提问来源于stack exchange,提问作者Marvin Core

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:47:17