如何通过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"}'
步骤说明:
sed 's/map\[//; s/\]//:去掉字符串首尾的map[]包裹s/ /\n/g:将空格分隔的键值对拆分为每行一个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
相关产品推荐
相关产品推荐

