如何让Curl命令仅输出Token并保存为环境变量?
问题描述
我执行了以下POST请求的curl命令:
curl --location --request POST 'https://xxx.xxx/authtoken' \ --header 'authString: OEU4MkVDRjctMERDNy0yRDlBLTYxNzZFOUFFMjI0OEMyRkI6NTU1QjVEOUItOTRGOS00MkM2LUJDRUFEQjE4MUU1MzhBMUU=' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Cookie: CFID=xxxx; CFTOKEN=xxxxxx; APITOKEN=xxxxxx; JSESSIONID=xxxxxxxxxx' \ --data-urlencode 'authString=xxxx-xxxx-xxxxx-xxxx=='
返回的JSON结果为:
{"message":"","success":true,"timestamp":"August, 04 2022 10:20:23","apiToken":"321D8093-0014-ED11-9105-0050568D5083"}
我需要提取其中的apiToken值并保存为环境变量,供后续curl命令使用,但尝试用grep未成功,求解决方法。
方法1:使用jq(推荐,专业JSON处理工具)
jq是专门处理JSON数据的命令行工具,能精准提取字段,避免正则匹配的各种格式兼容问题。
首先确保系统已安装jq:
- Debian/Ubuntu:
apt install jq - CentOS/RHEL:
yum install jq - macOS:
brew install jq
执行以下命令即可提取并设置环境变量:
# 执行curl请求并将apiToken存入环境变量 export APITOKEN=$(curl --location --request POST 'https://xxx.xxx/authtoken' \ --header 'authString: OEU4MkVDRjctMERDNy0yRDlBLTYxNzZFOUFFMjI0OEMyRkI6NTU1QjVEOUItOTRGOS00MkM2LUJDRUFEQjE4MUU1MzhBMUU=' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Cookie: CFID=xxxx; CFTOKEN=xxxxxx; APITOKEN=xxxxxx; JSESSIONID=xxxxxxxxxx' \ --data-urlencode 'authString=xxxx-xxxx-xxxxx-xxxx==' | jq -r '.apiToken') # 验证变量是否生效 echo $APITOKEN
-r参数让jq输出不带引号的原始字符串,适合直接作为环境变量值。
方法2:纯Shell工具组合(无jq时可用)
如果无法安装jq,可以用grep配合sed或awk提取,注意此方法依赖JSON格式稳定(字段顺序、引号格式不变):
方案A:grep + sed
export APITOKEN=$(curl ... | grep -o '"apiToken":"[^"]*"' | sed 's/"apiToken":"\([^"]*\)"/\1/')
grep -o '"apiToken":"[^"]*"':精准匹配"apiToken":"xxx"格式的片段,只输出匹配部分sed 's/"apiToken":"\([^"]*\)"/\1/':剔除字段名和引号,只保留token值
方案B:awk
export APITOKEN=$(curl ... | awk -F '"' '/apiToken/ {print $4}')
-F '"':以双引号作为字段分隔符/apiToken/:定位包含目标字段的行print $4:输出分割后的第4个字段(对应token值)
为什么单独用grep会失败?
单独使用grep只能定位包含apiToken的行或匹配片段,但无法直接提取嵌套在引号内的具体值,也无法处理JSON的结构格式,必须配合其他工具完成截取逻辑。
内容的提问来源于stack exchange,提问作者Mohammed Khawaja
相关产品推荐
相关产品推荐

