jqコマンドの使い方|インストール〜実行例まで

コマンドリファレンス

jq コマンドは、JSON を入力として受け取りフィルタで抽出・整形・変換・集計を行う CLI ツールです。sed/awk/grep の JSON 版のように扱え、curl で取得した API レスポンスの整形や、ログ・設定ファイルの加工、シェルスクリプトでの自動処理に日常的に使われます。(JqLang)
この記事では、jq コマンドのインストール方法から基本構文、実務で使うオプション、初心者がつまずきやすいポイントまでを実行例つきで解説します。

jqコマンドとは

jq は JSON データをコマンドラインで自由に加工できる軽量ツールです。curl や API から取得した JSON をそのまま人間が読むのは大変ですが、jq を通すだけで整形表示され、さらに特定のキーだけを抜き出したり、条件で絞り込んだりできます。(JqLang)

  • API レスポンスを整形して読みやすくする
  • JSON から必要なフィールドだけを抽出する
  • 複数の JSON ファイルを結合・集計する
  • ログやテキストを JSON に組み立て直す

インストール方法

主要な OS ではパッケージマネージャーから 1 コマンドで導入できます。

環境インストールコマンド
Debian / Ubuntusudo apt install jq
RHEL / CentOS / Fedorasudo dnf install jq
macOS(Homebrew)brew install jq
Windows(winget)winget install jqlang.jq

インストール後は次のコマンドでバージョンを確認し、正しく導入できているか確かめます。

jq --version
# jq-1.7.1

構文(Syntax)

# 基本形
jq [OPTIONS] 'FILTER' [FILE...]

# 代表例
curl ... | jq '.'                               # 整形表示(pretty print)
jq -r '.items[] | .name' data.json              # 生文字列で出力
jq -f script.jq input.json                      # フィルタをファイルから読み込み
jq -n --arg k v '{(env.k):$v}'                  # 入力なしで JSON を構築
  • フィルタ(FILTER)は jq 言語で記述します。. は恒等(入力をそのまま出力)。(JqLang)

主なオプション一覧

オプション説明使用例
-r, --raw-output文字列を JSON 文字列でなく生の文字列で出力jq -r '.version' package.json (JqLang)
-j, --join-output-r の派生。改行を付けないで連結出力jq -j '.[]' (JqLang)
-c, --compact-output1 行に圧縮して出力(機械処理向き)jq -c '.items' (JqLang)
-S, --sort-keysオブジェクトの キーをソートして出力jq -S '.' (JqLang)
-C / -M強制カラー / モノクロ出力`jq -C ‘.’
--tab / --indent Nインデントをタブ / スペース数 N に変更jq --indent 4 '.' (JqLang)
-s, --slurp入力全体を 配列1件として読み込むjq -s 'add' files*.json (JqLang)
-R, --raw-input入力を JSON として 解釈せず生テキストで受け取るjq -R 'split(\":\")' (JqLang)
-n, --null-input入力を読まず null を 1 度だけ流す(JSON の生成に)jq -n '{now:now}' (JqLang)
--stream巨大 JSON を ストリーミングで処理(path,leaf のペア)jq --stream '...reduce...' (JqLang)
--seqapplication/json-seq 形式で入出力jq --seq '.' (JqLang)
-f, --from-file FILEフィルタをファイルから読み込むjq -f filter.jq data.json (JqLang)
-L DIRモジュール検索パスを追加(import 用)jq -L lib -f main.jq (JqLang)
--arg name val文字列変数$name に注入jq --arg q "tokyo" '.city==$q' (JqLang)
--argjson name jsonJSON 値を変数として注入jq --argjson ids '[1,2]' 'map(select(.id IN($ids[])))' (JqLang)
--argfile name file / --slurpfile name fileファイル内容を変数へ(JSON/行スループ)jq --slurpfile cfg cfg.json '. + $cfg[0]' (JqLang)
-e, --exit-status最終結果で 終了コード を設定(監視/判定に便利)jq -e 'length>0' (JqLang)

実行例

最初の一歩:整形表示(pretty print)

説明: 引数なしの . フィルタは、JSON を色付き・インデント付きで見やすく整形するだけの、最も基本的な使い方です。
コマンド:

echo '{"name":"jq","version":"1.7.1"}' | jq '.'
{
  "name": "jq",
  "version": "1.7.1"
}

整形表示とキー抽出

説明: API レスポンスを整形し、配列要素の名前だけ取り出します。
コマンド:

curl -s https://api.github.com/repos/jqlang/jq/commits?per_page=3 \
| jq '.[] | {sha, author: .commit.author.name}'
jq -r '.[].commit.message' commits.json

(JqLang)

条件抽出と並び替え

説明: .items の中から active==true だけに絞り、名前でソート。
コマンド:

jq '.items | map(select(.active)) | sort_by(.name) | .[].name' data.json

select/ sort_by は定番フィルタです) (JqLang)

生テキストから JSON を組み立てる(ログ処理)

説明: key:value 形式の行を -R で読み、オブジェクトへ変換。
コマンド:

cat kv.txt | jq -R 'split(":") | { (.[0]): .[1] }' | jq -s 'add'

(JqLang)

巨大 JSON をストリーミングで集計(メモリ節約)

説明: ルート配列が非常に大きい場合でも --stream で段階処理。
コマンド:

jq --stream 'foreach ( .[] as $p (0; if ($p|length==2 and ($p[0]|last)=="price") then . + $p[1] else . end ))' big.json

--stream は path と値のペアを逐次出力します) (JqLang)

エラー例:入力が JSON でない

説明: 入力が JSON でないのに -R を付けないとパースエラーになります。
コマンド:

echo 'not json' | jq '.'

出力例(例):

parse error: Invalid numeric literal at line 1, column 5

対処: テキストなら -R を使う、あるいは JSON に整形してから渡します。(JqLang)

よくある質問

jq -r と jq . の違いは?

jq '.' は結果を JSON 形式(文字列ならダブルクォート付き)で出力しますが、jq -r はダブルクォートを外した生の文字列で出力します。シェルスクリプトで値をそのまま変数に代入したい場合は -r を使うのが基本です。

jq がインストールされているか確認するには?

jq --version または which jq で確認できます。未インストールの場合は上記の「インストール方法」を参照してください。

配列の要素数を数えるには?

jq '.items | length' data.json

JSON 以外(YAML など)を扱いたい場合は?

jq は JSON 専用です。YAML を扱いたい場合は、後述の yq(内部で jq 互換のフィルタ構文を使える版もあります)を利用します。

関連コマンド

  • curl : API レスポンスを取得して jq に渡す相棒。
  • grep : テキストの行単位検索。JSON を jq -r で整形してから grep に渡すことも多い。
  • sed / awk : テキスト全般の置換・抽出・集計。jq は JSON 特化版に相当。
  • yq : YAML 用のフィルタ(内部で jq 互換表現を使える版もあり)。
  • jo : シェルから JSON を構築するユーティリティ。
  • jqplay : ブラウザで jq を試せるプレイグラウンド。(jqプレイグラウンド)

備考

  • 引用とエスケープ: シェルのメタ文字と jq の構文が衝突しやすいので、Unix シェルでは 単一引用符 '...' を推奨(PowerShell/Windows では規則が異なる)。(JqLang)
  • 整形と配信: 人間向けは既定(カラー/整形)、機械向けは -c-r/-j を併用。(JqLang)
  • 大規模データ: 全体を配列化する -s は簡単ですがメモリ消費が増えます。巨大データは --streamreduce/foreach で段階処理を。(JqLang)
  • モジュール: -L で検索パスを追加し import で関数を再利用できます。(JqLang)
  • 終了コード: -e で 0/1/4 などに分岐でき、シェルの if/CI 判定に便利です。(JqLang)

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント