RESTREST [レスト]Representational State Transfer。WebAPIの設計原則 APIAPI [エーピーアイ]Application Programming Interface。異なるソフトウェア間の接続口のレスポンス確認やクラウドサービスのCLICLI [シーエルアイ]Command Line Interface。コマンドで操作するインターフェース実行、設定ファイルの管理など、LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル環境でJSONJSON [ジェイソン]JavaScript Object Notation。軽量データ交換フォーマット形式のデータを扱う機会は増えています。しかし、curlコマンドやAPIから返ってきた未整形のJSONは1行に凝縮されており、ターミナル上で人間が目視確認したり、シェルスクリプトで特定の値を抽出したりするのは困難です。
Linuxの jq コマンドを使用すれば、コマンドライン上でJSONデータを整形(プリティプリント)して見やすく表示するだけでなく、必要なプロパティの抽出や条件による絞り込み(フィルタリング)を直感的に実行できます。
この記事でわかること
jqコマンドのインストール手順と基本構文- JSONの整形(インデント表示)と特定プロパティの抽出方法
- 配列データの展開と
select関数による条件フィルタリング - シェルスクリプト連携で役立つ
-r(Raw出力)や-c(Compact出力)オプション
確認した環境
本記事で解説する手順や出力結果は、以下の環境で実際に実行して検証しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 22.04 LTS / DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューション 11(Ubuntu 24.04 LTSでも動作確認済み)
- ソフトウェア:
jq(jq-1.6 / jq-1.7)
jqコマンドとは?JSON処理を効率化するCLIツール
jq コマンドは、JSON形式のテキストデータを柔軟に加工・変換・抽出できる軽量なコマンドラインプロセッサです。Linux標準のテキスト処理コマンドである sed や awk、grep が行指向のテキストを処理するのに対し、jq はJSONのデータ構造(オブジェクトや配列)を理解した上でデータを取り扱えます。
そのため、正規表現や文字列操作を駆使してJSONから値を取り出す必要がなく、安全かつ簡潔な記述でデータ操作が可能です。
主要ディストリビューションへのインストール方法
多くの現行Linuxディストリビューションでは、標準パッケージマネージャーから簡単に jq を導入できます。
Ubuntu / Debian系の場合
sudo apt updatesudo apt install -y jqAlmaLinux / Rocky Linux / RHEL系の場合
RHEL 8 / 9 以降や AlmaLinux / Rocky Linux では、利用するバージョンや有効化されているリポジトリによってパッケージの提供元が異なります。まずは以下のコマンドでインストールできます。
sudo dnf install -y jqパッケージが見つからない場合は、利用しているディストリビューションのリポジトリ設定を確認してください(環境によっては EPEL などの追加リポジトリが必要になる場合があります)。なお、RHEL 7 系などの古い環境では、別途リポジトリ(epel-release など)の確認が必要です。
インストール後に以下のコマンドでバージョンが表示されれば、正常にセットアップ完了です。
$ jq --versionjq-1.6jqコマンドの基本構文とJSONの整形表示
jq コマンドは、パイプ(|)経由で標準入力からJSONを受け取るか、引数に対象ファイルを指定して実行します。
# パイプ経由で渡す場合cat <ファイル名>.json | jq [オプション] 'フィルター'
# ファイルを直接指定する場合jq [オプション] 'フィルター' <ファイル名>.json標準入出力の概念やパイプの詳しい仕組みについては、標準入力・標準出力・標準エラー出力の基本 をあわせて参照してください。
JSONを見やすくインデント整形する(ピリオド . フィルター)
最もシンプルなフィルターは、恒等変換を表すピリオド(.)です。入力されたJSONデータを構文解析し、適切なインデントと改行を加えてカラー表示(プリティプリント)します。
$ echo '{"name": "Alice", "age": 30, "skills": ["Linux", "Docker", "Python"]}' | jq '.'{ "name": "Alice", "age": 30, "skills": [ "Linux", "Docker", "Python" ]}未整形で1行に詰まった巨大なAPIレスポンスも、jq '.' を通すだけで瞬時に構造が把握できるようになります。
特定のキーや階層構造からプロパティを抽出する
JSONオブジェクトから特定の値を取り出したい場合は、.<キー名> の形式でフィルターを指定します。
オブジェクトの特定フィールドを抽出する
例えば、name の値だけを取り出したい場合は次のように実行します。
$ echo '{"name": "Alice", "age": 30}' | jq '.name'"Alice"ネスト(階層化)されたJSONから値を取り出す
オブジェクトの中に別のオブジェクトが含まれているネスト構造でも、ピリオドでキー名を繋げて指定できます。
$ echo '{"user": {"name": "Bob", "role": "admin"}}' | jq '.user.name'"Bob"存在しないキーを指定した場合は、エラーではなく null が返されます。なお、入力されたJSONの構文自体に誤りがある場合は、jq が解析エラーを返します。
配列データの展開と特定要素の抽出
JSONデータでは配列構造([...])を扱うケースが非常に多く存在します。jq では角括弧 [] を使って配列要素を展開します。
配列のすべての要素を展開する(.[])
配列内のすべての要素を順に取り出したい場合は、.[] を指定します。なお、Zsh などのシェルでは [] がパス名展開(グロブ)として解釈されるのを防ぐため、フィルター式はシングルクォートで囲んで記述します。
$ echo '["Linux", "Docker", "Git"]' | jq '.[]'"Linux""Docker""Git"各要素が個別のJSON値として1行ずつ出力されます。
配列内のオブジェクトから特定フィールドを一括取得する
複数のオブジェクトが並ぶ配列から、特定のフィールドだけを一覧で抽出したい場合は、.[] に続けてプロパティ名を指定します。
$ echo '[{"id": 1, "name": "web01", "status": "running"}, {"id": 2, "name": "db01", "status": "stopped"}]' | jq '.[].name'"web01""db01"サーバー一覧やユーザー一覧など、リスト形式のデータから特定の項目だけを素早く抜き出す際に便利です。
条件に合致する要素を絞り込む(select関数)
大量のデータから特定の条件に合致するものだけを取り出したい場合は、select() 関数を使用します。
指定した条件で要素をフィルタリングする
例えば、status が "running" のサーバーだけを抽出したい場合は、配列を展開した後にパイプで select() を繋ぎます。
$ echo '[{"id": 1, "name": "web01", "status": "running"}, {"id": 2, "name": "db01", "status": "stopped"}]' | jq '.[] | select(.status == "running")'{ "id": 1, "name": "web01", "status": "running"}フィルタリング結果からさらに特定キーのみ抽出する
条件で絞り込んだ後、さらにパイプで .name を繋げることで、条件に一致したオブジェクトの名前だけを取り出せます。
$ echo '[{"id": 1, "name": "web01", "status": "running"}, {"id": 2, "name": "db01", "status": "stopped"}]' | jq -r '.[] | select(.status == "running") | .name'web01実務で役立つ便利なコマンドオプション
シェルスクリプトやパイプライン処理で jq を組み込む際に役立つ主要なオプションを紹介します。
| オプション | 名称 | 主な役割 |
|---|---|---|
-r | --raw-output | 文字列を囲むダブルクォーテーションを外して出力する |
-c | --compact-output | 改行や余分なスペースを排除し、1行のコンパクトなJSONで出力する |
-s | --slurp | 複数のJSONストリームをまとめて単一の配列として読み込む |
-e | --exit-status | 最後に出力された値が null または false の場合は終了ステータスを 1、それ以外の場合は 0 にする。有効な結果が一度も生成されなかった場合は 4 にする(複数の値が出力された場合も、最後の値で判定されます) |
ダブルクォートを外す(-r オプション)
通常、文字列型のフィールドを抽出すると "Alice" のように前後にダブルクォーテーションが付与されます。-r(--raw-output)オプションを指定すると、フィルターの結果が文字列の場合に、JSON形式のダブルクォーテーションを付けずに出力できます。
なお、数値や真偽値などの文字列以外の値は、-r を付けても通常のJSON形式で出力されます。
# 通常出力(ダブルクォートあり)$ echo '{"name": "Alice"}' | jq '.name'"Alice"
# -r 付与(クォートなし)$ echo '{"name": "Alice"}' | jq -r '.name'AliceシェルスクリプトでJSONから文字列を取得し、変数への代入や他のコマンドへの引数として利用する場合は、-r オプションが便利です。
一方、取得した値をJSON形式のまま後続の処理に渡したい場合は、通常の出力形式を利用します。
1行のコンパクトな形式で出力する(-c オプション)
ログファイルへ出力する場合や、JSONデータのサイズを小さくして保存・転送したい場合は、-c(--compact-output)オプションを使用すると、インデントや改行を省いた1行形式で出力されます。
$ echo '{"name": "Alice", "age": 30, "skills": ["Linux", "Docker"]}' | jq -c '.'{"name":"Alice","age":30,"skills":["Linux","Docker"]}実践例:curlコマンドと連携してAPIレスポンスを処理する
実務で最も頻度の高いユースケースの1つが、Web APIを呼び出す curl コマンドとの連携です。
APIとの通信方法やPOSTリクエストの送信については、curlでJSONデータをPOST送信する方法 も参考にしてください。
例えば、GitHubGitHub [ギットハブ]Gitリポジトリをホストし、共同開発を支援するWebサービス APIからリポジトリ情報を取得し、リポジトリ名とスター数を取得する場合は以下のように連携します。
# 例: GitHub APIから特定リポジトリの情報を取得して整形curl -fsSL https://api.github.com/repos/jqlang/jq | jq '{name: .name, stars: .stargazers_count}'実行結果は次のように、必要な項目だけをまとめた新しいJSON形式で取得できます(スター数は実行時点によって変わります)。
{ "name": "jq", "stars": 36100}このように、入力されたJSONの構造を変換し、必要なキーだけを集めた別のJSONを生成することも jq の得意分野です。
まとめ
本記事では、Linuxの jq コマンドについて基本的な使い方から実務向けの活用方法まで解説しました。
jq '.'を実行するだけで、1行の未整形JSONをインデント付きで見やすく整形できる.<キー名>でオブジェクトのプロパティを抽出し、.[]で配列の要素を展開できるselect()関数を使うことで、特定の条件を満たす要素だけを抽出できる- シェル変数への代入には
-rオプション、1行化には-cオプションを活用する
JSONデータを扱うコマンドライン作業やシェルスクリプトの自動化において、jq コマンドは不可欠なツールです。基本のフィルターとオプションを組み合わせて、日々のデータ抽出やデバッグ作業を効率化しましょう。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。