Linuxのjqコマンドの使い方!JSONパース・抽出・整形の基本

Linuxのjqコマンドの使い方!JSONパース・抽出・整形の基本

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:3,684

LinuxでJSONデータをパース・抽出・整形できるjqコマンドの使い方を実機検証を交えてわかりやすく解説します。基本構文から特定キーの抽出、配列操作、selectによるフィルタリング、シェルスクリプトで便利な-rや-cオプションまで実践的なテクニックを網羅しています。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

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出力)オプション

確認した環境

本記事で解説する手順や出力結果は、以下の環境で実際に実行して検証しています。

jqコマンドとは?JSON処理を効率化するCLIツール

jq コマンドは、JSON形式のテキストデータを柔軟に加工・変換・抽出できる軽量なコマンドラインプロセッサです。Linux標準のテキスト処理コマンドである sed や awk、grep が行指向のテキストを処理するのに対し、jq はJSONのデータ構造(オブジェクトや配列)を理解した上でデータを取り扱えます。

そのため、正規表現や文字列操作を駆使してJSONから値を取り出す必要がなく、安全かつ簡潔な記述でデータ操作が可能です。

主要ディストリビューションへのインストール方法

多くの現行Linuxディストリビューションでは、標準パッケージマネージャーから簡単に jq を導入できます。

Ubuntu / Debian系の場合

Terminal window
sudo apt update
sudo apt install -y jq

AlmaLinux / Rocky Linux / RHEL系の場合

RHEL 8 / 9 以降や AlmaLinux / Rocky Linux では、利用するバージョンや有効化されているリポジトリによってパッケージの提供元が異なります。まずは以下のコマンドでインストールできます。

Terminal window
sudo dnf install -y jq

パッケージが見つからない場合は、利用しているディストリビューションのリポジトリ設定を確認してください(環境によっては EPEL などの追加リポジトリが必要になる場合があります)。なお、RHEL 7 系などの古い環境では、別途リポジトリ(epel-release など)の確認が必要です。

インストール後に以下のコマンドでバージョンが表示されれば、正常にセットアップ完了です。

Terminal window
$ jq --version
jq-1.6

jqコマンドの基本構文とJSONの整形表示

jq コマンドは、パイプ(|)経由で標準入力からJSONを受け取るか、引数に対象ファイルを指定して実行します。

Terminal window
# パイプ経由で渡す場合
cat <ファイル名>.json | jq [オプション] 'フィルター'
# ファイルを直接指定する場合
jq [オプション] 'フィルター' <ファイル名>.json

標準入出力の概念やパイプの詳しい仕組みについては、標準入力・標準出力・標準エラー出力の基本 をあわせて参照してください。

JSONを見やすくインデント整形する(ピリオド . フィルター)

最もシンプルなフィルターは、恒等変換を表すピリオド(.)です。入力されたJSONデータを構文解析し、適切なインデントと改行を加えてカラー表示(プリティプリント)します。

Terminal window
$ echo '{"name": "Alice", "age": 30, "skills": ["Linux", "Docker", "Python"]}' | jq '.'
{
"name": "Alice",
"age": 30,
"skills": [
"Linux",
"Docker",
"Python"
]
}

未整形で1行に詰まった巨大なAPIレスポンスも、jq '.' を通すだけで瞬時に構造が把握できるようになります。

特定のキーや階層構造からプロパティを抽出する

JSONオブジェクトから特定の値を取り出したい場合は、.<キー名> の形式でフィルターを指定します。

オブジェクトの特定フィールドを抽出する

例えば、name の値だけを取り出したい場合は次のように実行します。

Terminal window
$ echo '{"name": "Alice", "age": 30}' | jq '.name'
"Alice"

ネスト(階層化)されたJSONから値を取り出す

オブジェクトの中に別のオブジェクトが含まれているネスト構造でも、ピリオドでキー名を繋げて指定できます。

Terminal window
$ echo '{"user": {"name": "Bob", "role": "admin"}}' | jq '.user.name'
"Bob"

存在しないキーを指定した場合は、エラーではなく null が返されます。なお、入力されたJSONの構文自体に誤りがある場合は、jq が解析エラーを返します。

配列データの展開と特定要素の抽出

JSONデータでは配列構造([...])を扱うケースが非常に多く存在します。jq では角括弧 [] を使って配列要素を展開します。

配列のすべての要素を展開する(.[])

配列内のすべての要素を順に取り出したい場合は、.[] を指定します。なお、Zsh などのシェルでは [] がパス名展開(グロブ)として解釈されるのを防ぐため、フィルター式はシングルクォートで囲んで記述します。

Terminal window
$ echo '["Linux", "Docker", "Git"]' | jq '.[]'
"Linux"
"Docker"
"Git"

各要素が個別のJSON値として1行ずつ出力されます。

配列内のオブジェクトから特定フィールドを一括取得する

複数のオブジェクトが並ぶ配列から、特定のフィールドだけを一覧で抽出したい場合は、.[] に続けてプロパティ名を指定します。

Terminal window
$ echo '[{"id": 1, "name": "web01", "status": "running"}, {"id": 2, "name": "db01", "status": "stopped"}]' | jq '.[].name'
"web01"
"db01"

サーバー一覧やユーザー一覧など、リスト形式のデータから特定の項目だけを素早く抜き出す際に便利です。

条件に合致する要素を絞り込む(select関数)

大量のデータから特定の条件に合致するものだけを取り出したい場合は、select() 関数を使用します。

指定した条件で要素をフィルタリングする

例えば、status が "running" のサーバーだけを抽出したい場合は、配列を展開した後にパイプで select() を繋ぎます。

Terminal window
$ echo '[{"id": 1, "name": "web01", "status": "running"}, {"id": 2, "name": "db01", "status": "stopped"}]' | jq '.[] | select(.status == "running")'
{
"id": 1,
"name": "web01",
"status": "running"
}

フィルタリング結果からさらに特定キーのみ抽出する

条件で絞り込んだ後、さらにパイプで .name を繋げることで、条件に一致したオブジェクトの名前だけを取り出せます。

Terminal window
$ 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形式で出力されます。

Terminal window
# 通常出力(ダブルクォートあり)
$ echo '{"name": "Alice"}' | jq '.name'
"Alice"
# -r 付与(クォートなし)
$ echo '{"name": "Alice"}' | jq -r '.name'
Alice

シェルスクリプトでJSONから文字列を取得し、変数への代入や他のコマンドへの引数として利用する場合は、-r オプションが便利です。

一方、取得した値をJSON形式のまま後続の処理に渡したい場合は、通常の出力形式を利用します。

1行のコンパクトな形式で出力する(-c オプション)

ログファイルへ出力する場合や、JSONデータのサイズを小さくして保存・転送したい場合は、-c(--compact-output)オプションを使用すると、インデントや改行を省いた1行形式で出力されます。

Terminal window
$ 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からリポジトリ情報を取得し、リポジトリ名とスター数を取得する場合は以下のように連携します。

Terminal window
# 例: 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ライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top