jq コマンドです。
この記事では、jq の基本的なインストールから、JSON整形・フィールド抽出・配列処理・条件フィルタリング、そしてシェルスクリプトへの組み込みまで、現場で実際に使われるノウハウをまとめて解説します。
RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・jq . でJSONを整形して人間が読みやすい形に変換できる
・.フィールド名でネストしたキーも簡単に抽出できる
・.[index]や.[]で配列要素の取り出しや展開ができる
・select()で条件フィルタリングし、必要なデータだけ抽出できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
jqコマンドとは?(Linuxに標準搭載されないJSON処理ツール)
jq は、JSONデータをコマンドライン上でフィルタ・変換・整形するためのツールです。
名前は「JSON Query」の略とも言われますが、公式には「jq is a lightweight and flexible command-line JSON processor」と説明されています。
grep や awk がテキストデータを処理するのと同じ感覚で、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
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」が返ってくる時
フィールド名が存在しない場合、jq は null を返します。スペルミスやネスト構造の誤りを確認してください。
# フィールド名のスペルが違う場合は 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 .フィールド名 |
jqでJSON処理を自動化できたら、次はサーバー構築の全体像を学びませんか?
APIやCLIツールのJSON出力を自在に扱えるようになると、インフラ自動化の幅が一気に広がります。そのスキルをさらに活かして、体系的なLinuxサーバー構築を学んでみませんか。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:envsubstコマンドでシェル変数を環境変数で展開する方法|テンプレートファイルの動的生成と実務活用も
- この記事の属するカテゴリ:Linuxtips・シェルスクリプトへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます