28

私は現在bashスクリプトを作成しており、curlを使用しています。私がやりたいのは、応答の1つの特定のヘッダーを取得することです。

基本的に、このコマンドを機能させたいと思います。

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

残念ながら、-w、-write-outオプションには、サポートする変数のセットしかなく、応答の一部であるヘッダーを出力できないようです。ETag値を取得するためにcurl出力を自分で解析する必要がありますか、それとも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'

awkを使用するFS=": "と、値にスペースが含まれている場合に追加できます。

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オプションを使用して出力を解析します。-IHTTPメソッドをに変更することは注目に値しますHEAD。(のロングオプトバージョンは-Iです--head)。求めているフィールドとWebサーバーの動作によっては、これは違いのない区別になる場合があります。のようなヘッダーContent-Lengthは、との間で異なる場合がHEADありGETます。このオプションを使用して-X、目的のHTTPメソッドを強制し、それでもヘッダーのみを応答として表示します。

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 に答える