0

curl url_effective和num_redirects输出JSON格式:3个实战方案让重定向数据可直接被程序解析

2026.06.05 | youres | 20次围观

curl url_effective和num_redirects输出JSON格式:3个实战方案让重定向数据可直接被程序解析

用curl做重定向诊断时,默认输出是纯文本,不利于程序解析。把url_effectivenum_redirects输出成JSON格式,能让你的脚本直接被Python、Shell、Prometheus等工具消费。本文用3个实战方案,带你彻底搞懂curl输出JSON的完整思路。

为什么要把curl重定向变量输出成JSON

纯文本输出有三个问题:

  • 字段之间靠空格或换行分隔,解析麻烦
  • 多个URL批量检测时,输出混在一起,无法区分
  • 无法直接对接监控系统(Prometheus、Grafana要求指标是结构化数据)

JSON格式解决以上所有问题:每条记录是一个对象,字段名清晰,程序解析零成本。

方案一:curl -w @模板文件输出JSON(推荐)

curl的-w参数支持从文件读取输出格式,这是输出JSON最干净的方法。

第一步:创建JSON模板文件

新建文件 curl-format.json,内容如下:

{
  "http_code": %{http_code},
  "num_redirects": %{num_redirects},
  "url_effective": "%{url_effective}",
  "time_total": %{time_total}
}

第二步:调用curl时引用模板

curl -L -o /dev/null -s -w "@curl-format.json" https://example.com/

输出结果:

{
  "http_code": 200,
  "num_redirects": 2,
  "url_effective": "https://example.com/final-page",
  "time_total": 0.345
}

关键细节

  • url_effective是字符串,模板中必须用双引号包裹:"%{url_effective}"
  • http_codenum_redirectstime_total是数字,不能加引号
  • 如果URL包含重定向,必须加-L参数,否则num_redirects始终为0

方案二:curl输出与jq配合格式化为JSON

如果你用的是较旧版本的curl(不支持-w输出花括号),可以用curl输出tab分隔的纯文本,再用jq转换成JSON。

第一步:curl输出为tab分隔文本

curl -L -o /dev/null -s -w "%{http_code}\t%{num_redirects}\t%{url_effective}\n" https://example.com/

输出:

200    2    https://example.com/final-page

第二步:用jq转换为JSON

curl -L -o /dev/null -s -w "%{http_code}\t%{num_redirects}\t%{url_effective}\n" https://example.com/ | \
jq -R 'split("\t") | {http_code: .[0], num_redirects: .[1], url_effective: .[2]}'

方案三:批量检测多个URL输出JSON数组

实际运维中,你需要一次检测几十个域名。用Shell循环+临时文件拼接成JSON数组。

完整脚本

#!/bin/bash
echo "[" > results.json
first=true
while read url; do
  result=
  if [ "" = true ]; then
    echo "" >> results.json
    first=false
  else
    echo "," >> results.json
  fi
done < url-list.txt
echo "]" >> results.json

输出结果

[
  {"url": "http://example.com", "http_code": 200, "num_redirects": 2, "url_effective": "https://example.com/"},
  {"url": "http://test.com", "http_code": 301, "num_redirects": 1, "url_effective": "https://test.com/"}
]

三个方案对比

方案优点缺点适用场景
curl -w @模板原生支持,输出最干净模板文件中花括号需要curl 7.58+支持单机脚本、临时诊断
curl + jq兼容旧版curl,jq格式化能力强需要额外安装jqCI/CD流水线、跨机器运维
批量输出JSON数组可直接导入数据库或Prometheus脚本稍复杂,需注意逗号拼接网站巡检、监控告警

常见问题

Q: url_effective输出为空怎么办?

没加-L参数。curl默认不跟随重定向,url_effective只会显示你请求的原始URL。

Q: JSON中url_effective包含特殊字符导致格式错误?

jq@json函数自动转义:

echo '{"url": "https://example.com/?a=1&b=2"}' | jq '@json'

Q: Windows PowerShell中curl别名冲突怎么办?

PowerShell的curlInvoke-WebRequest的别名,不是GNU curl。解决方法是:

  1. 用完整路径调用:C:\Windows\System32\curl.exe(如果安装了Git for Windows)
  2. 或者直接调用curl.exe(Git环境变量优先时)
  3. 最稳妥:用Invoke-WebRequestMaximumRedirection参数模拟重定向检测

内链推荐

总结

把curl的url_effectivenum_redirects输出成JSON格式,核心是用-w @模板文件或在输出后接jq格式化。对于批量检测场景,拼接JSON数组能让你的巡检数据直接对接监控告警系统。三个方案各有优劣,按你的实际环境选择即可。

如果你在Windows下用PowerShell跑curl遇到别名冲突,记得用curl.exe明确调用GNU curl,或者改用Invoke-WebRequest重写检测逻辑。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论