2026.06.05 | youres | 21次围观
curl url_effective和num_redirects输出JSON格式:3个实战方案让重定向数据可直接被程序解析
用curl做重定向诊断时,默认输出是纯文本,不利于程序解析。把url_effective和num_redirects输出成JSON格式,能让你的脚本直接被Python、Shell、Prometheus等工具消费。本文用3个实战方案,带你彻底搞懂curl输出JSON的完整思路。
为什么要把curl重定向变量输出成JSON
纯文本输出有三个问题:
- 字段之间靠空格或换行分隔,解析麻烦
- 多个URL批量检测时,输出混在一起,无法区分
- 无法直接对接监控系统(Prometheus、Grafana要求指标是结构化数据)
JSON格式解决以上所有问题:每条记录是一个对象,字段名清晰,程序解析零成本。
方案一:curl -w @模板文件输出JSON(推荐)
curl的-w参数支持从文件读取输出格式,这是输出JSON最干净的方法。
第一步:创建JSON模板文件
新建文件 curl-format.json,内容如下:
{
"http_code": %{http_code},
"num_redirects": %{num_redirects},
"url_effective": "%{url_effective}",
"time_total": %{time_total}
}
第二步:调用curl时引用模板
curl -L -o /dev/null -s -w "@curl-format.json" https://example.com/
输出结果:
{
"http_code": 200,
"num_redirects": 2,
"url_effective": "https://example.com/final-page",
"time_total": 0.345
}
关键细节
url_effective是字符串,模板中必须用双引号包裹:"%{url_effective}"http_code、num_redirects、time_total是数字,不能加引号- 如果URL包含重定向,必须加
-L参数,否则num_redirects始终为0
方案二:curl输出与jq配合格式化为JSON
如果你用的是较旧版本的curl(不支持-w输出花括号),可以用curl输出tab分隔的纯文本,再用jq转换成JSON。
第一步:curl输出为tab分隔文本
curl -L -o /dev/null -s -w "%{http_code}\t%{num_redirects}\t%{url_effective}\n" https://example.com/
输出:
200 2 https://example.com/final-page
第二步:用jq转换为JSON
curl -L -o /dev/null -s -w "%{http_code}\t%{num_redirects}\t%{url_effective}\n" https://example.com/ | \
jq -R 'split("\t") | {http_code: .[0], num_redirects: .[1], url_effective: .[2]}'
方案三:批量检测多个URL输出JSON数组
实际运维中,你需要一次检测几十个域名。用Shell循环+临时文件拼接成JSON数组。
完整脚本
#!/bin/bash
echo "[" > results.json
first=true
while read url; do
result=
if [ "" = true ]; then
echo "" >> results.json
first=false
else
echo "," >> results.json
fi
done < url-list.txt
echo "]" >> results.json
输出结果
[
{"url": "http://example.com", "http_code": 200, "num_redirects": 2, "url_effective": "https://example.com/"},
{"url": "http://test.com", "http_code": 301, "num_redirects": 1, "url_effective": "https://test.com/"}
]
三个方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| curl -w @模板 | 原生支持,输出最干净 | 模板文件中花括号需要curl 7.58+支持 | 单机脚本、临时诊断 |
| curl + jq | 兼容旧版curl,jq格式化能力强 | 需要额外安装jq | CI/CD流水线、跨机器运维 |
| 批量输出JSON数组 | 可直接导入数据库或Prometheus | 脚本稍复杂,需注意逗号拼接 | 网站巡检、监控告警 |
常见问题
Q: url_effective输出为空怎么办?
没加-L参数。curl默认不跟随重定向,url_effective只会显示你请求的原始URL。
Q: JSON中url_effective包含特殊字符导致格式错误?
用jq的@json函数自动转义:
echo '{"url": "https://example.com/?a=1&b=2"}' | jq '@json'
Q: Windows PowerShell中curl别名冲突怎么办?
PowerShell的curl是Invoke-WebRequest的别名,不是GNU curl。解决方法是:
- 用完整路径调用:
C:\Windows\System32\curl.exe(如果安装了Git for Windows) - 或者直接调用
curl.exe(Git环境变量优先时) - 最稳妥:用
Invoke-WebRequest的MaximumRedirection参数模拟重定向检测
内链推荐
- curl -w多变量组合格式化输出重定向信息:5个实战模板让跳转诊断事半功倍
- curl批量检测网站跳转次数脚本:3个实战脚本让重定向链路无处可藏
- curl -w num_redirects配合url_effective追踪完整跳转链路:3个实战场景彻底搞定
总结
把curl的url_effective和num_redirects输出成JSON格式,核心是用-w @模板文件或在输出后接jq格式化。对于批量检测场景,拼接JSON数组能让你的巡检数据直接对接监控告警系统。三个方案各有优劣,按你的实际环境选择即可。
如果你在Windows下用PowerShell跑curl遇到别名冲突,记得用curl.exe明确调用GNU curl,或者改用Invoke-WebRequest重写检测逻辑。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论