为什么需要同时输出多个curl变量
调试网站重定向时,光知道最终URL还不够。你可能同时想知道:跳了几次?耗时多少?状态码是什么?一个个跑curl太麻烦,-w参数支持一次性输出所有这些信息。
很多同学只会用-w "%{url_effective}"输出单个变量,其实-w的格式化字符串里可以塞任意多个变量,还能加文字说明和换行,输出结果直接能当报告用。
技巧一:基础多变量拼接输出
最简单的写法,把多个%{变量名}直接拼在一起:
curl -s -o /dev/null -w "状态码:%{http_code} 跳转次数:%{num_redirects} 最终URL:%{url_effective}\n" -L https://example.com
输出示例:
状态码:200 跳转次数:1 最终URL:https://www.example.com/
这种方式适合快速查看,一眼就能看到关键数据。缺点是变量多了之后一行太长,可读性下降。
技巧二:换行分隔多变量输出
加上\n换行符,每个变量单独一行,阅读更清晰:
curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n总耗时: %{time_total}s\n" -L https://example.com
输出示例:
HTTP状态码: 200
跳转次数: 1
最终URL: https://www.example.com/
总耗时: 0.342s
这是最常用的格式化方式,每个变量带中文标签,换行显示,一目了然。Shell脚本里用这种写法最方便。
技巧三:用模板文件管理复杂格式
当变量超过5个,命令行写法就太长了。这时候用-w @模板文件,把格式化字符串存到文件里:
先创建模板文件curl-format.txt:
=== 重定向诊断报告 ===
URL: %{url_effective}
HTTP状态码: %{http_code}
跳转次数: %{num_redirects}
重定向URL: %{url_redirect}
DNS耗时: %{time_namelookup}s
连接耗时: %{time_connect}s
总耗时: %{time_total}s
========================
然后引用模板:
curl -s -o /dev/null -w @curl-format.txt -L https://example.com
模板文件的好处是一次编写、反复使用。团队巡检脚本统一用同一个模板文件,输出格式一致,排查效率更高。
技巧四:输出CSV格式方便导入Excel
批量巡检结果要存Excel分析?直接输出CSV格式:
curl -s -o /dev/null -w "%{http_code},%{num_redirects},%{url_effective},%{time_total}\n" -L https://example.com
配合批量脚本使用:
#!/bin/bash
echo "状态码,跳转次数,最终URL,总耗时"
while read url; do
curl -s -o /dev/null -w "%{http_code},%{num_redirects},%{url_effective},%{time_total}\n" -L ""
done < urls.txt > report.csv
CSV格式直接用Excel打开,排序筛选都方便。如果URL里包含逗号,用引号包裹即可避免列错位。
技巧五:输出JSON格式配合jq解析
最灵活的方式,输出JSON格式,后续用jq或其他工具处理:
curl -s -o /dev/null -w '{"http_code":%{http_code},"num_redirects":%{num_redirects},"url_effective":"%{url_effective}","time_total":%{time_total}}\n' -L https://example.com
输出示例:
{"http_code":200,"num_redirects":1,"url_effective":"https://www.example.com/","time_total":0.342}
管道给jq美化输出:
curl -s -o /dev/null -w '{"http_code":%{http_code},"num_redirects":%{num_redirects},"url_effective":"%{url_effective}","time_total":%{time_total}}\n' -L https://example.com | jq .
注意:JSON格式中字符串变量要用双引号包裹(如%{url_effective}),数值变量不用加引号(如%{http_code})。如果URL本身包含双引号会导致JSON格式错误,生产环境建议用模板文件配合脚本生成。
常用变量速查表
| 变量 | 含义 | 类型 |
|---|---|---|
| %{http_code} | HTTP状态码 | 数值 |
| %{num_redirects} | 重定向次数 | 数值 |
| %{url_effective} | 最终URL | 字符串 |
| %{url_redirect} | 重定向目标URL | 字符串 |
| %{time_total} | 总耗时(秒) | 数值 |
| %{time_namelookup} | DNS解析耗时 | 数值 |
| %{time_connect} | TCP连接耗时 | 数值 |
| %{time_redirect} | 重定向耗时 | 数值 |
| %{size_download} | 下载字节数 | 数值 |
| %{speed_download} | 下载速度(字节/秒) | 数值 |
三个实战场景
场景1:检测短链重定向是否保留UTM参数
curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" -L "https://short.link/abc?utm_source=wechat"
如果最终URL里还包含utm_source=wechat,说明参数保留了;否则就要排查中间哪一跳丢掉了。
场景2:批量网站性能巡检
for url in ; do
echo -n " -> "
curl -s -o /dev/null -w "状态:%{http_code} 耗时:%{time_total}s 跳转:%{num_redirects}次\n" -L ""
done
场景3:重定向链路完整诊断
curl -s -o /dev/null -w @curl-format.txt -L --max-redirs 5 https://example.com
配合--max-redirs限制最大跳转次数,防止无限重定向卡住。
常见坑和注意事项
- 变量名大小写敏感:
%{http_code}不能写成%{HTTP_CODE},输出会原样显示 - Windows PowerShell中换行:PowerShell对
\n支持不一致,建议用替代,或直接用模板文件 - 特殊字符转义:URL中的
%会被curl当成变量前缀,如果格式化字符串里要输出百分号,写成%% - -o /dev/null必须加:不加的话网页内容会和格式化输出混在一起,干扰结果
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论