それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

curl コマンドで、特定の(ヘッダ)情報だけを取り出す。レスポンスヘッダ write-out (-w )

curl は色々とオプションがあるので、使い込むと楽しい

-w オプションで、必要な物を取り出す。

レスポンスコード

curl -I -s -o /dev/null  http://store.apple.com -w '%{http_code}\n'
301

ダウンロード・サイズ

curl -L -s -o /dev/null  http://store.apple.com -w '%{size_download}\n'
59770

これらを必要な出力(JSON)にまとめる

出力はJSONにまとめることが出来る

takuya@atom:~$ curl -L -s -o /dev/null  http://store.apple.com -w '{ "dl_size" : %{size_download}, "status_code" : %{http_code}   }' |  jq .
{
  "dl_size": 59851,
  "status_code": 200
}

うーん便利。

よく使いそうなものをまとめて、JSON

curl -s -o /dev/null  https://store.apple.com/  -w  '{
"http_code" : "%{http_code}",
"time_total" : "%{time_total}",
"time_namelookup" : "%{time_namelookup}",
"time_connect" : "%{time_connect}",
"time_redirect" : "%{time_redirect}",
"size_download" : "%{size_download}",
"size_request" : "%{size_request}",
"speed_download" : "%{speed_download}",
"content_type" : "%{content_type}",
"num_connects" : "%{num_connects}",
"num_redirects" : "%{num_redirects}",
"redirect_url" : "%{redirect_url}"
}"' | jq .

実行結果

{
  "http_code": "301",
  "time_total": "0.163",
  "time_namelookup": "0.002",
  "time_connect": "0.008",
  "time_redirect": "0.000",
  "size_download": "0",
  "size_request": "79",
  "speed_download": "0.000",
  "content_type": "",
  "num_connects": "1",
  "num_redirects": "0",
  "redirect_url": "https://store.apple.com/us"
}

これは、わざわざ指定しなくてもcurl に用意されている(curl version7.70.0 以降 2023-02-13確認)

curl -k -w '%{json}\n'  https://store.apple.com/  
curl -k -w '%{json}\n'  https://store.apple.com/   | jq .

任意のヘッダを取り出す(curl 7.84.0以降)

curl -w "%header{date}" https://apple.com/
curl -w "%header{expires}" https://apple.com/

任意のレスポンス・ヘッダ(応答ヘッダ)の項目を取り出す機能が7.84 以降に搭載されている。

Output HTTP headers from the most recent request by using %header{name} where name is the case insensitive name of the header (without the trailing colon). The header contents are exactly as sent over the network, with leading and trailing whitespace trimmed. Added in curl 7.84.0.

-w で使えるオプション

結構色々と使えます。速度測定に便利ですね。phpruby で書くとどうも何処がオーバーヘッドになってるかわからないし、curl ならシェルにコピペでいいいわけで。

curl の動かない環境はないに等しいのでパパっと使えて便利ですね。

  • filename_effective
  • http_code
  • http_connect
  • time_total
  • time_namelookup
  • time_connect
  • time_appconnect
  • time_pretransfer
  • time_redirect
  • time_starttransfer
  • size_download
  • size_upload
  • size_header
  • size_request
  • speed_download
  • speed_upload
  • content_type
  • num_connects
  • num_redirects
  • redirect_url
  • ftp_entry_path
  • ssl_verify_result

curlのサンプルで使ったよくつかうオプション

基本 -s オプション -o オプション

-o オプションは、出力ファイルを指定する。/dev/null とか指定すると便利です。

curl -o /dev/null http://store.apple.com/jp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 55332    0 55332    0     0  1747k      0 --:--:-- --:--:-- --:--:-- 2843k

リダイレクトより、 -o /dev/null のほうが curl のヘッダオプションを使うときは扱いやすいので、こちらを使いました。

-s オプションは、プログレスバーを出さない。 silent モード

curl -o /dev/null -s http://store.apple.com/jp
## 何も出ない

基本その2 -I オプションと -L オプション

-I をつけるとヘッダ情報だけ出せる。

-L オプションをつけると、リダイレクトを追跡します。

 curl -I -L   http://store.apple.com
HTTP/1.1 301 Moved Permanently
x-request-id: 9e9179c7-7cac-4a83-bab9-9d6f53ba21e3
Pragma: no-cache
Location: /us
Content-Length: 0
x-frame-options: sameorigin
Cache-Control: private, must-revalidate, proxy-revalidate, max-age=24, post-check=0, pre-check=0
Expires: Tue, 23 Sep 2014 13:34:33 GMT
Date: Tue, 23 Sep 2014 13:34:09 GMT
Connection: keep-alive

HTTP/1.1 200 OK
Cache-Control: no-store, private, must-revalidate, proxy-revalidate, max-age=0, pre-check=0, post-check=0, no-cache
ETag: "6a68935248b237f3bb92bf6654ca3bb3"
Expires: Mon, 22 Sep 2014 13:34:09 GMT
Last-Modified: Tue, 23 Sep 2014 13:33:13 GMT
Pragma: no-cache
X-XSS-Protection: 1; mode=block
Content-Type: text/html;charset=UTF-8
x-request-id: e9da1b39-44f5-4bf4-8be6-fa2dc2692022
x-frame-options: sameorigin
Date: Tue, 23 Sep 2014 13:34:09 GMT
Connection: keep-alive
Set-Cookie: dssid2=eef56de0-36ae-4dfa-ba8c-48fb30b943f6; Domain=.apple.com; Expires=Wed, 23-Sep-2015 13:34:09 GMT; Path=/
Set-Cookie: dssf=1; Domain=.apple.com; Expires=Wed, 23-Sep-2015 13:34:09 GMT; Path=/
Set-Cookie: dc=nc; Domain=.store.apple.com; Expires=Tue, 23-Sep-2014 14:04:09 GMT; Path=/

参考資料

curl コマンドで速度測定。 - それマグで!

2023/02/13 header{name} と header_json に付いて言及

ヘッダの好きな項目をcurl の write out で取り出す機能が実装されていたので、調べて追記した。

最新版を入手するのは、2023-02-13 現在では、apt提供がなくてコンパイルしか方法がなくて面倒だった。

libcurl とセットになっていて、OSに使われているので、最新版の提供がOSのパッケージ・システムから提供がない場合は、コンパイルしインストールせずにバイナリ単体で試すのがベター

debianubuntu には提供が特になかった。