2026.06.01 | youres | 28次围观
为什么要把 curl -w 的输出转成 JSON?
curl 的 -w(--write-out)参数可以在请求完成后打印变量,比如状态码、耗时、重定向次数。但默认输出是纯文本,不利于程序解析。
配合 jq 可以把这些性能数据直接转成结构化 JSON,方便写入日志、接入监控系统、或者用脚本批量分析。
curl -w 输出格式化基础
-w 支持两种用法:直接写格式字符串,或者从文件读取模板(-w @filename)。
直接写字符串的例子:
curl -s -o /dev/null -w "状态码:%{http_code} 耗时:%{time_total}s" https://www.youres.cn
输出是纯文本:状态码:200 耗时:0.245s,程序解析起来很麻烦。
方法一:让 curl -w 直接输出 JSON(推荐)
在 -w 的格式字符串里直接写 JSON 结构,把 curl 变量嵌进去:
curl -s -o /dev/null \
-w '{"http_code":%{http_code},"time_total":%{time_total},"redirect_count":%{num_redirects}}\n' \
https://www.youres.cn
输出:
{"http_code":200,"time_total":0.245,"redirect_count":0}
这个输出本身就是合法 JSON,可以直接被 jq 解析,也可以直接写入日志文件。
方法二:用 jq 从纯文本输出解析(适合已有脚本改造)
如果现有的脚本已经用 -w 输出了纯文本,可以用 jq -n 来构造 JSON:
result=
echo "" | jq -nR 'reduce inputs split("=") as [,] ({}; .[] = ( | tonumber? // ))'
输出:
{
"code": 200,
"total": 0.245,
"redirects": 0
}
方法三:用 -w @模板文件 + jq 管道处理
把 -w 的格式写进文件,更适合复杂场景:
先创建模板文件 curl-format.json:
{
"http_code": %{http_code},
"time_total": %{time_total},
"time_connect": %{time_connect},
"time_starttransfer": %{time_starttransfer},
"num_redirects": %{num_redirects},
"url_effective": "%{url_effective}"
}
然后调用:
curl -s -o /dev/null -w @curl-format.json https://www.youres.cn | jq .
注意:模板里字符串类型的变量(如 %{url_effective})需要加引号,数字类型的不用。
实战:批量检测多个网站并输出 JSON 日志
把每个网站的 curl 性能数据输出成一行 JSON,方便后续分析:
#!/bin/bash
urls="https://www.youres.cn https://www.baidu.com https://www.qq.com"
for url in ; do
curl -s -o /dev/null \
-w "{\"url\":\"\",\"http_code\":%{http_code},\"time_total\":%{time_total},\"time_connect\":%{time_connect}}\n" \
""
done | jq -s . > curl-results.json
jq -s . 把所有行的 JSON 合并成一个数组,最终 curl-results.json 的内容:
[
{"url":"https://www.youres.cn","http_code":200,"time_total":0.24,"time_connect":0.05},
{"url":"https://www.baidu.com","http_code":200,"time_total":0.03,"time_connect":0.01},
{"url":"https://www.qq.com","http_code":200,"time_total":0.08,"time_connect":0.02}
]
常见坑:url_effective 含特殊字符导致 JSON 非法
如果 URL 里含有双引号、反斜杠、换行符,直接拼进 JSON 会报错。用 jq 来处理:
curl -s -o /dev/null \
-w '%{http_code}\n%{time_total}\n%{url_effective}\n' \
"https://www.youres.cn" \
| jq -nR '[inputs] | {http_code: (.[0]|tonumber), time_total: (.[1]|tonumber), url_effective: .[2]}'
让 jq 来负责字符串转义,比自己在 -w 模板里处理可靠得多。
内链参考
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论