以详细模式过滤 curl 标头输出

以详细模式过滤 curl 标头输出

使用curl -v ...,即打印出输入和输出标头的详细模式。但是,此信息未通过管道传输,我无法 grep 出我不需要的行。

如何过滤 curl 标头输出?

答案1

输出的 headercurl会被打印到标准错误中。因此你必须使用重定向,例如 grep 出 header Content-Length

curl -v google.com 2>&1 | grep -vi content-length

答案2

与其使用curl -v(详细模式),更好的选择是告诉curl将标头输出到 STDOUT,而不进行所有额外的调试,也不打印响应主体。这样,您可以grep只查看响应标头,避免 shell 重定向的需要,并且知道您的过滤不必理解和解析 的curl内部调试消息(这些消息可能不被视为其 API 的一部分)。

你可以这样做通过组合-I(不打印正文)、-X«METHOD»(覆盖方法)和-s(静默,不显示进度条)参数

curl -sIXGET https://www.google.com/ | grep -i content-type:
  • -s指示curl隐藏进度条。如果省略并curl检测到它正在终端中运行,它将绕过管道并直接与终端对话以显示进度条,这通常没有帮助并且会使终端混乱。
  • -I指示curl在收到标头后断开与服务器的连接,而不是等待正文。如果你真的像问题中所说的那样,有兴趣通过 grep 来查找,那么这很有用仅 HTTP 响应标头。它还有一个副作用,就是将请求方法默认为,HEAD就像您指定的那样-XHEAD
  • -X«method»(例如-XGET)会覆盖该方法。在许多情况下,HEAD请求就是您想要的,因为 HTTP 标准规定HEAD必须返回与同一请求完全相同的标头。但是,在调试服务器或使用不符合标准的服务器时,指示发出请求但在读取响应主体之前断开连接GET会很有用。这样,您可以看到curlGET实际的服务器将响应发送的标头GET而不是希望服务器能够正确实现。

相关内容