如何用awk或sed提取并替换JSON格式中的Base64值?
首先得说,你之前用awk {'print $14'}没用是因为整个返回的JSON是单个连续的字符串,没有按空格拆分成多个字段,自然拿不到第14个元素。咱们换更靠谱的方法来处理:
一、最推荐的方法:用jq处理JSON(专业工具少踩坑)
jq是专门用来处理JSON数据的工具,比awk/sed适合太多了,步骤如下:
1. 提取Base64值
直接从JSON里精准提取Value字段的内容:
curl -s --request GET http://10.0.10.10:8500/v1/kv/w-key-value | jq -r '.[0].Value'
-r参数是让jq输出原始字符串(不带双引号),方便后续解码。
2. 提取并解码Base64,再取第14个字段
把提取到的Base64直接解码,然后用awk拿你要的第14个元素:
curl -s --request GET http://10.0.10.10:8500/v1/kv/w-key-value | jq -r '.[0].Value' | base64 -d | awk '{print $14}'
解码后你的内容是[{ CreateIndex: 100, ModifyIndex: 200, LockIndex: 200, Key: zip, Flags: 0, Value: 1 Session: adf4238a-882b-9ddc-4a9d-5b6758e4159e }],第14个字段就是adf4238a-882b-9ddc-4a9d-5b6758e4159e,刚好是你要的Session值。
二、用awk/sed提取Base64值(应急方案)
如果没法用jq,可以用文本匹配的方式提取,但要注意JSON格式不能变(比如Value字段的位置、引号格式不能改):
1. 用sed提取Base64
curl -s --request GET http://10.0.10.10:8500/v1/kv/w-key-value | sed -n 's/.*"Value":"\([^"]*\)".*/\1/p'
原理是匹配"Value":"开头,直到下一个"的内容,把中间的部分提取出来。
2. 提取+解码+取第14字段
和jq的流程一样,管道串起来就行:
curl -s --request GET http://10.0.10.10:8500/v1/kv/w-key-value | sed -n 's/.*"Value":"\([^"]*\)".*/\1/p' | base64 -d | awk '{print $14}'
三、替换JSON中的Base64值
如果要把原JSON里的Value换成新的Base64值,还是推荐用jq:
1. 先把新内容编码成Base64
比如你要替换的新内容是{ "Session": "new-session-id" },先转成Base64:
new_content='{ "Session": "new-session-id" }' new_base64=$(echo -n "$new_content" | base64)
2. 用jq替换并更新到Consul
直接用jq修改JSON的Value字段,再用PUT请求写回Consul:
curl -s --request GET http://10.0.10.10:8500/v1/kv/w-key-value | jq --arg new_val "$new_base64" '.[0].Value = $new_val' | curl -X PUT http://10.0.10.10:8500/v1/kv/w-key-value -d @-
或者更直接的,不用先GET,直接把新的Base64内容PUT进去:
echo -n "$new_content" | base64 | curl -X PUT http://10.0.10.10:8500/v1/kv/w-key-value -d @-
内容的提问来源于stack exchange,提问作者ikask

