jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, シェルスクリプト > jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も
「curlでAPIのレスポンスを取得したけれど、JSONが1行に詰まっていて読めない」 「シェルスクリプトでJSONの特定フィールドだけ取り出したいのに、awkやsedでは複雑すぎる」 サーバー運用やインフラ自動化の現場では、APIやクラウドのCLIツールがJSON形式でデータを返してくることが日常茶飯事です。そこで必須になるのが jq コマンドです。 この記事では、jq の基本的なインストールから、JSON整形・フィールド抽出・配列処理・条件フィルタリング、そしてシェルスクリプトへの組み込みまで、現場で実際に使われるノウハウをまとめて解説します。 RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・jq . でJSONを整形して人間が読みやすい形に変換できる
・.フィールド名でネストしたキーも簡単に抽出できる
・.[index]や.[]で配列要素の取り出しや展開ができる
・select()で条件フィルタリングし、必要なデータだけ抽出できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

jqコマンドとは?(Linuxに標準搭載されないJSON処理ツール)

jq は、JSONデータをコマンドライン上でフィルタ・変換・整形するためのツールです。 名前は「JSON Query」の略とも言われますが、公式には「jq is a lightweight and flexible command-line JSON processor」と説明されています。 grepawk がテキストデータを処理するのと同じ感覚で、JSONの構造を理解した上でデータを取り出せるのが最大の特徴です。curl と組み合わせてAPIレスポンスを処理したり、aws CLIや kubectl の出力から必要なフィールドだけを抽出したりする場面で、現場では欠かせないツールになっています。

jqのインストール

1. RHEL系(dnf/yum)でのインストール

# RHEL 9 / Rocky Linux 9 / AlmaLinux 9 $ sudo dnf install -y jq # バージョン確認 $ jq --version jq-1.6

RHEL系では jq は標準リポジトリに含まれているため、追加のリポジトリ設定は不要です。

2. Ubuntu / Debianでのインストール

# Ubuntu 24.04 / Debian 12 $ sudo apt install -y jq # バージョン確認 $ jq --version jq-1.7.1

基本的な使い方

1. JSONを整形して表示する(. フィルタ)

jq の最も基本的な使い方は、圧縮されたJSONを整形して読みやすく表示することです。 フィルタに .(ドット)を指定するだけで、インデント付きの整形出力が得られます。

# 圧縮されたJSONを整形して表示する $ echo '{"name":"web01","status":"running","cpu":45}' | jq . { "name": "web01", "status": "running", "cpu": 45 }

curl でAPIレスポンスを取得してパイプで渡すと、そのまま整形表示できます。

# APIレスポンスを整形して表示する例 $ curl -s https://api.example.com/status | jq .

2. 特定フィールドを抽出する(.フィールド名)

JSONのキーを指定して、特定のフィールドだけを取り出せます。.フィールド名 の形で記述します。

# name フィールドだけを取り出す $ echo '{"name":"web01","status":"running","cpu":45}' | jq .name "web01" # ダブルクォートなしで文字列を出力したい場合は -r オプションを使う $ echo '{"name":"web01","status":"running","cpu":45}' | jq -r .name web01

-r(raw output)オプションを付けると、文字列型の値のダブルクォートが除かれます。シェル変数に代入するときは -r が必須です。

3. ネストしたフィールドを取り出す(.key1.key2)

ネストしたJSONでも、ドットでつないで深い階層のフィールドを取り出せます。

# ネストしたJSONの例 $ cat server.json { "name": "web01", "network": { "ip": "192.168.10.101", "port": 443 } } # ネストした network.ip を取り出す $ jq -r .network.ip server.json 192.168.10.101

jq はファイルを直接引数に取ることもできます。cat でパイプする必要はありません。

配列の処理

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

JSONの配列に対して .[] を使うと、要素を1つずつ展開して出力できます。

# サーバーリストの配列を展開する $ cat servers.json [ {"name":"web01","status":"running"}, {"name":"web02","status":"stopped"}, {"name":"db01","status":"running"} ] # 配列の全要素を展開して表示する $ jq .[] servers.json { "name": "web01", "status": "running" } { "name": "web02", "status": "stopped" } { "name": "db01", "status": "running" }

5. 配列の特定インデックスを取り出す(.[index])

# 0番目(先頭)の要素を取り出す $ jq '.[0]' servers.json { "name": "web01", "status": "running" } # 最後の要素を取り出す $ jq '.[-1]' servers.json { "name": "db01", "status": "running" }

6. 配列の各要素から特定フィールドを取り出す

.[].フィールド名 を組み合わせると、配列の各要素から特定フィールドのみを取り出せます。

# 全サーバーの name フィールドだけを取り出す $ jq -r '.[].name' servers.json web01 web02 db01 # name と status を組み合わせて表示する $ jq -r '.[] | "\(.name): \(.status)"' servers.json web01: running web02: stopped db01: running

条件フィルタリングと応用操作

7. select()で条件に合う要素だけ取り出す

select() を使うと、条件に一致する要素だけをフィルタリングできます。

# status が "running" のサーバーだけを取り出す $ jq '.[] | select(.status == "running")' servers.json { "name": "web01", "status": "running" } { "name": "db01", "status": "running" } # status が "running" のサーバーの name だけを取り出す $ jq -r '.[] | select(.status == "running") | .name' servers.json web01 db01

条件には ==(等しい)のほか、!=(等しくない)、><(数値比較)なども使えます。

8. 複数フィールドを組み合わせたオブジェクトを作る

{} を使って、既存のJSONから必要なフィールドだけを選んで新しいJSONを作れます。

# name と status だけを含む新しいJSONを作る $ jq '.[] | {server: .name, state: .status}' servers.json { "server": "web01", "state": "running" } { "server": "web02", "state": "stopped" } { "server": "db01", "state": "running" }

9. 配列の要素数を数える(length)

# 配列の要素数を表示する $ jq 'length' servers.json 3 # running のサーバー数を数える $ jq '[.[] | select(.status == "running")] | length' servers.json 2

シェルスクリプトへの組み込み

10. jqの出力をシェル変数に代入する

-r オプションを使い、$()でコマンド置換すれば、シェル変数に値を代入できます。

#!/bin/bash # APIからサーバー名を取得してシェル変数に格納する例 RESPONSE='{"name":"web01","status":"running","cpu":45}' SERVER_NAME=$(echo "$RESPONSE" | jq -r .name) CPU_USAGE=$(echo "$RESPONSE" | jq -r .cpu) echo "サーバー名: $SERVER_NAME" echo "CPU使用率: $CPU_USAGE%" # 出力例 # サーバー名: web01 # CPU使用率: 45%

11. jqでJSONを生成する(--arg, --argjson)

シェル変数からJSONを組み立てるときに便利な --arg オプションです。

#!/bin/bash # シェル変数を使ってJSONを生成する HOSTNAME="web01" STATUS="running" JSON=$(jq -n --arg name "$HOSTNAME" --arg status "$STATUS" \ '{name: $name, status: $status}') echo "$JSON" # 出力例 # { # "name": "web01", # "status": "running" # }

--arg は値を文字列型として渡します。数値や真偽値を渡したい場合は --argjson を使ってください。

トラブルシュート・エラー対処

「parse error: Invalid numeric literal」が出た時

このエラーは、JSONの構文が正しくない場合に発生します。

# エラーになる例(キーにクォートがない) $ echo '{name: "web01"}' | jq . parse error (Invalid numeric literal at EOF at line 1, column 14) # 正しい例(キーもダブルクォートで囲む) $ echo '{"name": "web01"}' | jq . { "name": "web01" }

「null」が返ってくる時

フィールド名が存在しない場合、jqnull を返します。スペルミスやネスト構造の誤りを確認してください。

# フィールド名のスペルが違う場合は null が返る $ echo '{"name":"web01"}' | jq .hostname null # まずは . で全体を確認してキー名を特定する $ echo '{"name":"web01"}' | jq . { "name": "web01" }

「Cannot index array with string」が出た時

配列に対して .フィールド名 でアクセスしようとした場合に発生します。配列には .[].[index] を使ってください。

# エラーになる例(配列にフィールド名でアクセス) $ echo '[{"name":"web01"}]' | jq .name null # 正しい例(配列を展開してからフィールドにアクセス) $ echo '[{"name":"web01"}]' | jq '.[0].name' "web01" # または配列展開を使う $ echo '[{"name":"web01"}]' | jq -r '.[].name' web01

本記事のまとめ

jq を使いこなせるようになると、APIやCLIツールのJSON出力をシェルスクリプトで効率的に処理できるようになります。Linux ポート確認の全コマンドと組み合わせてサービス状態を確認したり、Linux DNS 設定の基本と連携してDNS情報をスクリプトで自動取得したりと、インフラ自動化の幅が広がります。
やりたいこと コマンド
JSONを整形して表示 jq . ファイル名
特定フィールドを抽出 jq .フィールド名 ファイル名
ネストしたフィールドを抽出 jq .key1.key2 ファイル名
配列の全要素を展開 jq .[] ファイル名
配列の先頭要素を取得 jq '.[0]' ファイル名
条件に合う要素を絞り込む jq '.[] | select(.key == "値")' ファイル名
文字列出力(クォートなし) jq -r .フィールド名 ファイル名
要素数を数える jq 'length' ファイル名
シェル変数からJSON生成 jq -n --arg key "$変数" '{key: $key}'
curl と組み合わせてAPIを処理 curl -s URL | jq .フィールド名
また、Linux 基本コマンドの解説も合わせて参照すると、Linuxコマンドの体系的な理解に役立ちます。

jqでJSON処理を自動化できたら、次はサーバー構築の全体像を学びませんか?

APIやCLIツールのJSON出力を自在に扱えるようになると、インフラ自動化の幅が一気に広がります。そのスキルをさらに活かして、体系的なLinuxサーバー構築を学んでみませんか。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。