【初心者向け】curlとjqでAPI自動化!シェルスクリプトでデータ操作をマスターする実践ガイド

そのcurl、まだコピペで終わらせていませんか?

「よし、curlでAPIを叩いてデータを取ってこれたぞ!」

チュートリアルを終え、curlの基本的な使い方をマスターしたあなた。しかし、毎日同じようなcurlコマンドを何度も手で打ち込みながら、「この作業、もっと楽にならないかな…」とため息をついたことは?
あるいは、ターミナルに表示された、あの整形されていないJSONの羅列を前に、思わずそっと画面を閉じてしまった経験はありませんか?

もし、あなたがこれらの問いに少しでも頷いたなら、この記事はまさにあなたのためのものです。

curlは単体でも強力なツールですが、その真価は他のコマンドラインツールと連携し、ワークフローを自動化することで発揮されます。
この記事を読み終える頃には、あなたはcurlの出力を自在に操作し、面倒な手作業をシェルスクリプトに任せることができ、開発者としてステップアップしていることでしょう!


この記事が特に役立つ方

  • curlの基本的なGET/POSTはできるが、返ってきたJSONの扱いに困っている方
  • コマンドラインでの作業を効率化し、自動化の第一歩を踏み出したいと考えている方
  • APIを使った情報収集や簡単なテストを、もっと手軽に行いたいWeb開発者
  • インフラの監視や定型作業を自動化したいと考えている学生や若手エンジニア

さあ、curlを単なる「データを取得するツール」から、「仕事の相棒」へと進化させる旅を始めましょう!

動作検証環境

この記事で紹介するcurlコマンドの動作は、以下の環境で検証しています。

  • OS: Ubuntu 24.04.3 LTS
  • ハードウェア: VAIO VJP131

目次


curljqの強力な連携:JSONデータを自在に操るコマンドライン術

curlでAPIを叩くと、返ってくるのは多くの場合JSON形式のデータです。しかし、そのままでは改行もインデントもなく、非常に読みにくいですよね。ここで登場するのが、jqという最高の相棒です。

jqとは?:JSONのための高性能なデータ処理ツール

jqは、JSONデータを自在に整形、抽出、加工できるコマンドラインツールです。複雑なJSONの構造を解析し、必要な情報だけを的確に取り出すことができます。
例えるなら、散らかった部屋から目的のものを瞬時に見つけ出す、整理整頓の達人のような存在です。

まだインストールしていない方は、お使いの環境に合わせてインストールしておきましょう。

# Ubuntu/Debianの場合
sudo apt update
sudo apt install jq

# macOSの場合 (Homebrew)
brew install jq

以下のコマンドを実行して、jqが正しくインストールされているか確認してください。

jq --version

より詳細な情報や高度な使い方については、jqの公式ドキュメントを参照してください。

パイプ(|)でcurlの出力をjqに渡す:実践的なデータ整形

curljqの連携は驚くほど簡単です。curlコマンドの出力を、パイプ(|)を使ってjqコマンドに渡すだけ。これだけで、curlの強力なデータ取得能力と、jqの高度なデータ処理能力を組み合わせることができます。

jsonダミーデータ

まずは、ダミーAPI(https://jsonplaceholder.typicode.com/users/1)からユーザー情報を取得してみましょう。

curlだけの実行結果:

まずは、非整形のJSONデータをsample.jsonとして保存し、その内容を確認してみましょう。

echo '{"id":1,"name":"Leanne Graham","username":"Bret","email":"Sincere@april.biz","address":{"street":"Kulas Light","suite":"Apt. 556","city":"Gwenborough","zipcode":"92998-3874","geo":{"lat":"-37.3159","lng":"81.1496"}},"phone":"1-770-736-8031 x56442","website":"hildegard.org","company":{"name":"Romaguera-Crona","catchPhrase":"Multi-layered client-server neural-net","bs":"harness real-time e-markets"}}' > sample.json

見ての通り、すべての情報が1行に詰め込まれていて、どこに何があるのかさっぱりです。
APIから直接取得する場合も同様に読みにくいJSONが返ってきます。

cat sample.json

{"id":1,"name":"Leanne Graham","username":"Bret","email":"Sincere@april.biz","address":{"street":"Kulas Light","suite":"Apt. 556","city":"Gwenborough","zipcode":"92998-3874","geo":{"lat":"-37.3159","lng":"81.1496"}},"phone":"1-770-736-8031 x56442","website":"hildegard.org","company":{"name":"Romaguera-Crona","catchPhrase":"Multi-layered client-server neural-net","bs":"harness real-time e-markets"}}

curljqを連携させた結果:

では次に、jqにパイプで繋いでみましょう。jq '.' は「入力されたJSONを整形して出力する」という意味の最も基本的なjqコマンドです。

まずは、先ほど作成したsample.jsonjqで整形してみます。

cat sample.json | jq '.'

どうでしょう!見違えるように綺麗にフォーマットされ、データの構造が一目瞭然になりました。

{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
}

さらにjqの真骨頂は、特定のデータだけを抽出できることです。例えば、ユーザー名(name)とメールアドレス(email)だけが欲しい場合は、次のようにします。

curl https://jsonplaceholder.typicode.com/users/1 | jq '{user_name: .name, user_email: .email}'
{
  "user_name": "Leanne Graham",
  "user_email": "Sincere@april.biz"
}

このように、curl | jq の組み合わせは、APIから取得した情報を扱う際の基本にして、最強のテクニックです!さて、あなたの普段の業務で、curljqを使ってどんな情報を整形・抽出してみたいですか?


シェルスクリプトでcurlを自動化する:日々のタスクを効率化

curljqの連携に慣れてきたら、次はいよいよ自動化の世界へ足を踏み入れましょう。
何度も実行する一連のコマンドは、シェルスクリプトにまとめることで、一行のコマンドで再実行できるようになります。

実践例1:天気予報APIを叩くスクリプトで情報収集を自動化

簡単な例として、無料の天気予報APIを使って、指定した場所の現在の天気を取得するスクリプトを作成してみましょう。ここでは、気象庁のAPIを利用します。

get_weather.sh

#!/bin/bash
set -euo pipefail

# 地域コード(例:130000は東京)
AREA_CODE="130000"

# 気象庁のAPIエンドポイントを定義
API_URL="https://www.jma.go.jp/bosai/forecast/data/forecast/${AREA_CODE}.json"

# curlでAPIを叩き、jqで天気と気温を抽出する
# -s: サイレントモード(プログレスバーなどを非表示にする)
# -r: raw出力モード(文字列をクォートせずにそのまま出力する)
curl -s "${API_URL}" | jq -r '.[0].timeSeries[0].areas[0] as $f0 | .[0].timeSeries[2].areas[0].temps[0] as $t0 | "場所: \($f0.area.name)\n天気: \($f0.weathers[0])\n気温: \($t0)℃"'
[NOTE]
シェルスクリプトを書く際は、ファイルの先頭に #!/bin/bash と記述し、set -euo pipefail を加えておくことをお勧めします。これは、スクリプトの堅牢性を高めるためのベストプラクティスです。
  • -e: コマンドが失敗した場合、即座にスクリプトを終了します。
  • -u: 未定義の変数を使用した場合、エラーとします。
  • -o pipefail: パイプライン中のいずれかのコマンドが失敗した場合、パイプライン全体を失敗とします。
    これにより、予期せぬエラーによるスクリプトの誤動作を防ぎ、デバッグを容易にします。

このスクリプトを実行可能にして、実行してみます。

chmod +x get_weather.sh
./get_weather.sh

実行結果(例):

場所: 東京地方
天気: 晴れ 夜 くもり
気温: 19
[著者の経験談]
以前、私はちょっとしたサービスの稼働状況をSlackに通知するために、Pythonでスクリプトを書いていました。curlとシェルスクリプトを使えば、数行で同じことが実現できるのです。皆さんも、curlが使えるところをどんどん探してみてください!

実践例2:Webサイトの死活監視スクリプトでシステム運用を効率化

次に、もう少し実用的な例として、指定したWebサイトが正常に稼働しているか(死活監視)をチェックするスクリプトを考えてみましょう。

このスクリプトのワークフローは以下のようになります。

指定したWebサイトが正常に稼働しているか(死活監視)をチェックするスクリプトのワークフロー

check_health.sh

#!/bin/bash
set -euo pipefail

# 監視対象のURLを定義
TARGET_URL="https://example.com"

# curlでHTTPステータスコードを取得
# -s: プログレスバーを非表示
# -o /dev/null: ボディ出力を捨てる
# -w "% {http_code}": ステータスコードだけを出力
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "${TARGET_URL}")

# ステータスコードが200なら正常、それ以外なら異常
if [ "${HTTP_STATUS}" -eq 200 ]; then
  echo "✅ [${TARGET_URL}] is UP. (Status: ${HTTP_STATUS})"
else
  echo "❌ [${TARGET_URL}] is DOWN. (Status: ${HTTP_STATUS})"
fi
[TIP]
HTTPステータスコードは、Webサーバーからの応答を示す3桁の数字です。200 OKはリクエストが成功したことを意味し、404 Not Foundはページが見つからない、500 Internal Server Errorはサーバー内部のエラーなどを示します。これらのコードを理解することで、Webサイトの状態をより詳細に把握できます。

実行してみましょう。

chmod +x check_health.sh
./check_health.sh

実行結果(例):

 [https://example.com] is UP. (Status: 200)
[TIP]
この死活監視スクリプトをcron(Linuxのジョブスケジューラ)に登録すれば、例えば5分おきに自動でサイトをチェックし、異常があればメールやSlackに通知する、といった本格的な監視システムを簡単に構築できます。

あなたの日常業務で、curlとシェルスクリプトを使って自動化したいタスクはありますか?


よくある質問(FAQ):curljqの疑問を解決

Q1: jqをインストールしようとするとエラーが出ます。
A1: aptbrewの前に、sudo apt updatebrew updateを実行して、パッケージリストを最新の状態にしてみてください。また、エラーメッセージをよく読むと、依存関係の問題など、解決のヒントが書かれていることが多いです。

Q2: Windows環境でも同じことはできますか?
A2: はい、可能です。Windows 10/11であれば、WSL (Windows Subsystem for Linux) を使うことで、UbuntuなどのLinux環境を構築し、curljqを同じように利用できます。Git for Windows に同梱されている Git Bash を使うのも良い選択肢です。

Q3: もっと複雑なJSONレスポンスをパースするにはどうすればいいですか?
A3: jqは非常に高機能で、配列の要素をループで処理したり、複数の値を組み合わせたりと、複雑な操作も可能です。公式サイトのチュートリアルやクックブックが素晴らしいリソースになります。まずは簡単な抽出から始め、少しずつjqの強力な機能を学んでいくのがお勧めです。


まとめ:あなたの自動化への第一歩と次のステップ

今回は、curlを他のコマンドラインツールと連携させることで、その可能性を大きく広げる方法を学びました。

  • curl | jqは最強のコンビ: APIから返される読みにくいJSONも、jqを使えば一目瞭然。必要なデータだけをスマートに抽出できます。
  • シェルスクリプトで定型作業を自動化: 天気予報の取得やWebサイトの死活監視など、curlを使った一連の作業をスクリプト化することで、あなたの貴重な時間を節約できます。
  • 自動化は小さな一歩から: 本格的な監視システムも、今日学んだ簡単なスクリプトの積み重ねです。

知識は、使ってこそ力になります。

今日からできる、はじめの一歩として、あなたが普段よく利用するWebサイトやAPIのレスポンスを、curljqを使って整形し、必要な情報だけを抜き出す、というのを試してみてはいかがでしょうか?

演習問題:GitHub APIから自分のリポジトリ情報を取得してみよう

GitHubのユーザーAPI (https://api.github.com/users/YOUR_USERNAME/repos) を使って、あなたのGitHubアカウントのリポジトリ一覧を取得し、各リポジトリのnamestargazers_countだけを抽出するシェルスクリプトを作成してみましょう。ヒント:jqの配列処理とオブジェクトのフィルタリングを活用してください。

この記事が役に立ったら
ぜひチームに共有したり、X(旧Twitter)で感想をポストしていただけると、執筆の励みになります!あなたの小さなアクションが、日本の開発文化をより良くする大きな一歩になるかもしれません。


本記事をご利用いただくにあたって

この記事は、公開時点(2025年9月)の情報に基づき、正確な情報を提供するよう努めています。
しかし、本記事で解説するソフトウェアやサービスの仕様は日々更新されるため、記事内で紹介している画面や手順が、ご覧いただいている時点では変更されている可能性があります。
もし内容に相違がある場合は、各サービスの最新の公式ドキュメントも併せてご参照ください。本記事の情報を利用される際は、ご自身の判断と責任においてお願いいたします。


SNSでもご購読できます。

コメントを残す

*