0

curl -w格式化输出详解:变量大全+6个实战场景,从此告别verbose翻找

2026.05.26 | youres | 9次围观

什么是 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辅助作者原创,未经许可,转载请保留原文链接。

发表评论