什么是 curl -w(--write-out)
用过 curl 的人大多知道 -o 可以把响应内容保存到文件,-I 可以只看响应头。但有一个参数经常被忽略——-w(--write-out)。它的作用很简单:请求完成后,按照你指定的模板输出一行自定义信息。
比如你想知道一个请求耗时多久、HTTP状态码是多少、下载了多少字节——一行命令就能搞定,不用翻找 verbose 输出。
基本语法
curl -w "模板字符串" -o /dev/null -s https://example.com
几点说明:
-w "..."里的内容就是模板,变量用%{变量名}的格式- 配合
-o /dev/null丢弃响应体(Linux)或-o NUL(Windows),只看输出信息 -s静默模式,关掉进度条,让输出更干净
最常用的变量一览
curl -w 提供了几十个变量,但日常用到的就这几个:
HTTP 响应相关
| 变量 | 含义 |
|---|---|
%{http_code} | HTTP 状态码(如 200、301、404) |
%{http_version} | HTTP 版本(如 1.1、2、3) |
%{content_type} | Content-Type 响应头 |
%{redirect_url} | 重定向目标 URL |
%{ssl_verify_result} | SSL 证书验证结果(0=成功) |
%{num_redirects} | 重定向次数 |
时间和性能相关
| 变量 | 含义 |
|---|---|
%{time_total} | 整个请求总耗时(秒,精确到小数) |
%{time_namelookup} | DNS 解析耗时 |
%{time_connect} | TCP 连接建立耗时 |
%{time_appconnect} | SSL/TLS 握手完成耗时 |
%{time_pretransfer} | 从开始到收到服务器第一个字节之前 |
%{time_starttransfer} | 从开始到收到第一个响应字节(TTFB) |
%{time_redirect} | 所有重定向耗时总和 |
数据量相关
| 变量 | 含义 |
|---|---|
%{size_download} | 下载字节数 |
%{size_upload} | 上传字节数 |
%{size_header} | 响应头字节数 |
%{speed_download} | 平均下载速度(字节/秒) |
%{speed_upload} | 平均上传速度(字节/秒) |
连接和远程信息
| 变量 | 含义 |
|---|---|
%{remote_ip} | 远端服务器 IP |
%{remote_port} | 远端端口 |
%{local_ip} | 本机 IP |
%{local_port} | 本机端口 |
实战场景
场景一:快速检查网站状态
最基础的用法——一条命令看状态码和耗时:
curl -w "\n状态码: %{http_code}\n总耗时: %{time_total}s\n" -o /dev/null -s https://www.youres.cn
输出:
状态码: 200
总耗时: 0.352s
简单直接,运维日常巡检的首选。
场景二:性能分析(TTFB + 各阶段耗时)
想知道一个网站响应慢在哪里?DNS解析慢、TLS握手慢、还是服务器处理慢?一行命令定位:
curl -w "DNS解析: %{time_namelookup}s\nTCP连接: %{time_connect}s\nTLS握手: %{time_appconnect}s\n首字节时间(TTFB): %{time_starttransfer}s\n总耗时: %{time_total}s\n" -o /dev/null -s https://www.youres.cn
输出示例:
DNS解析: 0.003s
TCP连接: 0.045s
TLS握手: 0.112s
首字节时间(TTFB): 0.230s
总耗时: 0.352s
如果 DNS 解析就花了 500ms,说明 DNS 服务有问题;如果 TLS 握手占比大,说明证书链过长或服务器配置需要优化;如果 TTFB 减去 TLS 的时间很大,那就是服务器应用层处理慢。
场景三:JSON 格式化输出
写脚本的时候,用 JSON 格式输出方便后续处理。注意 -w 不支持嵌套 JSON,但可以构造一个扁平的 JSON 字符串:
curl -w '{"url":"%{url_effective}","code":%{http_code},"time":%{time_total},"ttfb":%{time_starttransfer},"size":%{size_download}}\n' -o /dev/null -s https://www.youres.cn
输出:
{"url":"https://www.youres.cn/","code":200,"time":0.352,"ttfb":0.230,"size":12345}
配合 jq 或者脚本解析,批量检测时特别好用。
场景四:配合 -o 把结果写回文件
批量检测场景下,把每次的结果追加到 CSV 文件:
#!/bin/bash
for url in $(cat urls.txt); do
result=$(curl -w "%{url_effective},%{http_code},%{time_total},%{size_download}\n" -o /dev/null -s "$url")
echo "$result" >> result.csv
done
跑完之后你就有一份完整的网站状态报表了。
场景五:SSL 证书快速验证
curl -w "SSL验证结果: %{ssl_verify_result}\nHTTP版本: %{http_version}\n" -o /dev/null -s https://www.youres.cn
ssl_verify_result 为 0 表示证书验证通过,非 0 则有问题。
场景六:检测重定向链
curl -w "重定向次数: %{num_redirects}\n最终URL: %{url_effective}\n重定向耗时: %{time_redirect}s\n" -o /dev/null -s -L https://httpbin.org/redirect/3
加 -L 跟随重定向后,url_effective 就是最终到达的 URL,方便排查重定向配置是否正确。
几个容易踩的坑
1. Windows 下 -w 用双引号要小心
PowerShell 中双引号会被解析,建议用单引号:
curl.exe -w '状态码: %{http_code}' -o NUL -s https://www.youres.cn
注意 Windows 10+ 自带 curl,要写 curl.exe,不然可能和 PowerShell 的 Invoke-WebRequest 别名冲突。
2. 换行符处理
模板里的 \n 在大多数 shell 里能正常识别。如果发现没有换行,试试加 $'\n'(bash)或者直接用 echo 包一层。
3. -w 输出的是请求完成后的信息
-w 的内容在请求完成后输出。如果你同时用了 -v(verbose),-w 的内容会出现在最后面。
4. 变量名写错了不会报错
如果你把 %{http_code} 写成 %{http_status},curl 不会报错,只会原样输出 %{http_status}。所以变量名一定要对照文档写准确。
进阶技巧
从文件读取模板
模板太长写一行不方便?用 @文件名 从文件读取:
curl -w @format.txt -o /dev/null -s https://www.youres.cn
format.txt 内容:
URL: %{url_effective}
状态码: %{http_code}
TTFB: %{time_starttransfer}s
下载大小: %{size_download} bytes
平均速度: %{speed_download} bytes/s
条件输出(模拟)
curl -w 本身不支持 if/else,但可以结合 shell 的功能实现条件判断:
code=$(curl -w "%{http_code}" -o /dev/null -s https://www.youres.cn)
if [ "$code" -ne 200 ]; then
echo "异常!状态码: $code"
fi
总结
curl -w 是个被严重低估的参数。它不需要装额外工具,不需要写复杂脚本,就能输出结构化的请求信息。日常运维中,我建议把常用模板保存成 shell alias,随用随调:
alias curltime='curl -w "DNS:%{time_namelookup}s TCP:%{time_connect}s TLS:%{time_appconnect}s TTFB:%{time_starttransfer}s Total:%{time_total}s\n" -o /dev/null -s'
一条 curltime https://example.com 就能搞定网站性能快检,省时省力。
相关文章推荐:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论