jq – JSON をフィルタ・変換・抽出するコマンドラインプロセッサ

JSON/構造化データ
スポンサーリンク

jq は JSON を入力として受け取り、フィルタで抽出や整形・変換・集計を行う CLI ツールです。sed/awk/grep の JSON 版のように扱え、スクリプトやパイプラインでの自動処理に最適です。(JqLang)
フィールド抽出、配列の加工、ログの整形、API レスポンスの整形・要約などで日常的に使われます。(JqLang)

構文(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)

実行例

整形表示とキー抽出

説明: 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)

関連コマンド

  • yq : YAML 用のフィルタ(内部で jq 互換表現を使える版もあり)。
  • jo : シェルから JSON を構築するユーティリティ。
  • jqplay : ブラウザで jq を試せるプレイグラウンド。(jqプレイグラウンド)
  • curl / httpie : API レスポンスを取得して 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玄をフォローする

コメント