curlでステータスコードだけを取得する(ちょっとしたシェル芸)

みなさん、どうも、@ukohank517です。

今回はnullデバイス(/dev/null)を経由しないで、 シェルコマンドだけでステータスコードのみを取得するcurlの書き方につい記録しようと思います。 (自分のメモにもなるので)

結論:

curl -is ${url} | sed -n 1P | cut -d ' ' -f 2

この記事ではこのコマンドが一番言いたかった。

結論を一番最初に持ってきました。

なお時間がある方は引き続き下の文書も読んでいただければと思います。

他の方法

実はnullデバイスを経由する書き方なら、たくさんの情報があります。

例として、Qiitaさんの記事で、こんなのもありました:

$ curl -LI mazgi.com -o /dev/null -w '%{http_code}\n' -s

しかし、諸事情によりnullデバイスを経由しないでステータスコードをのみ取得する場合もありますよね?

筆者の場合は、認証周りの自動テストで403エラーをチェックするために使いました。

その際使用したのが一番上のコマンドになります。

一体このコマンドは何しているの?

上記のコマンドを2つのパイプラインで繋いでいるので、

それぞれ何しているのがを見ていきましょう。

[1]. curl -is ${url}

こちらはmanコマンドでcurlを確認すれば分かります。

  • まずは、オプション-iプロトコルヘッダーを取得しています。ステータスコードはこの中に含まれています。
  • 次にオプション-sでサイレントモードにし、通信状況やエラーを無視するようにしました。

このコマンドにより下記のデータが取得できます。

${protcol_header}

${site_body}

サイトの中身にもよりますが、${site_body}にはhtmlもしくはjsonレスボンスが入っています。

[2]. sed -n 1P

上記のcurlコマンドにより、我々が欲しいステータスコードプロトコルヘッダーの一行目に入ってることが確認できると思います。

sedコマンドで一行目を切り出すのがこのコマンドの機能です。

[1],[2]をパイプラインで繋げて実行したことで、正しく情報を取得できていれば以下のような結果になります。

HTTP/1.1  200 OK

[3]. cut -d ' ' -f 2

上記[2]の結果で得られた結果を良く見てみると、

スペースで区切ってあり、なおステータスコードが2番目に入ってることがわかると思います。

このcutコマンドでスペースで区切ることを指定して、2番目を取得すれば、

ステータスコードが取得できました。

もちろん、エラーの時もその結果が帰って来るし、

存在しないページは空文字列が帰ってきます。

後書き

筆者は今年でエンジニアの卵として社会に出ました。

どっかの交流会で見かけたらぜひ声をお掛けください。


ご指摘、ご意見などがあれば、[@ukohank517|twitter]にでご連絡いただければ修正します。