0

curl -w输出多个变量格式化技巧:5种写法让重定向诊断数据一目了然

2026.06.05 | youres | 16次围观

为什么需要同时输出多个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辅助作者原创,未经许可,转载请保留原文链接。

发表评论