28

我目前正在编写一个 bash 脚本,并且正在使用 curl。我想要做的是获取响应的一个特定标头。

基本上我希望这个命令起作用:

curl -I -w "%{etag}" "server/some/resource"

不幸的是,似乎 -w, --write-out 选项只有一组它支持的变量,并且不能打印作为响应一部分的任何标题。我是否需要自己解析 curl 输出以获取 ETag 值,或者有没有办法让 curl 打印特定标头的值?

显然像

curl -sSI "server/some/resource" | grep 'ETag:' | sed -r 's/.*"(.*)".*/\1/'

可以解决问题,但是让 curl 过滤标题会更好。

4

3 回答 3

25

您可以使用单个 sed 或 awk 命令打印特定的标头,但 HTTP 标头使用 CRLF 行尾。

curl -sI stackoverflow.com | tr -d '\r' | sed -En 's/^Content-Type: (.*)/\1/p'

FS=": "如果值包含空格,您可以使用 awk 添加:

awk 'BEGIN {FS=": "}/^Content-Type/{print $2}'
于 2012-11-28T20:25:03.030 回答
23

为“-w”指定的变量不直接连接到 http 标头。所以看起来你必须自己“解析”它们:

curl -I "server/some/resource" | grep -Fi etag
于 2012-09-20T11:57:27.797 回答
8

其他答案使用该-I选项并解析输出。值得注意的是,-I将 HTTP 方法更改为HEAD. (长选项版本-I--head)。根据您所追求的领域和网络服务器的行为,这可能是一个没有区别的区别。和之间的标头 likeContent-Length可能不同。使用该选项强制使用所需的 HTTP 方法,并且仍然只将标头视为响应。HEADGET-X

curl -sI http://ifconfig.co/json | awk -v FS=": " '/^Content-Length/{print $2}'
18

curl -X GET -sI http://ifconfig.co/json | awk -v FS=": " '/^Content-Length/{print $2}'
302
于 2019-11-01T12:54:49.663 回答