
jqは2012年にスティーブン・ドラン(Stephen Dolan)が公開したJSON処理用のコマンドラインツールで、シェル上のJSONに対するsed/awkのような役割を担います。C言語で書かれた単一バイナリで配布され、依存関係がほとんどないためあらゆるUnix系環境に持ち込めるのが強みです。「.users[] | select(.age > 30) | .name」のような独自構文の式を渡すことで、巨大なJSONレスポンスから必要な要素だけを抽出・整形できます。本記事ではjqの設計と歩み、curlとの相性の良さを順に整理します。
この記事の目次
- jqを支える三つの特性
- 2012年のGitHub公開からデファクトへ
- 実務での使われ方
- yq・gron・fxとの位置関係
- まとめ
jqを支える三つの特性

jqの最大の特徴は、その独自の関数型風プログラミング言語です。「.」が入力全体、「.foo」がプロパティアクセス、「.[]」が配列展開、「|」がパイプを表し、map/select/reduce/group_byなどの関数を組み合わせて任意のJSON変換を記述できます。値はストリームとして流れる前提で設計されており、一つの入力から複数値を生成したり、複数の入力を一つにまとめたりが自然に書けます。
実装上の特性として、jqは入力JSONをストリーミング解析できる「--stream」モードを持ち、巨大ファイルでも全体をメモリに載せずに処理できます。また配布はC実装の単一バイナリで、依存ライブラリがほぼなく、Linux・macOS・Windowsのどこにも投げ込めばすぐ動きます。この「軽量・自己完結・移植性が高い」性質が、サーバーログ解析やAPI連携スクリプトでの定番化を後押ししました。jq自体が小さなDSL(ドメイン特化言語)であるため、覚える要素は限られていますが、複雑な変換にも耐える表現力を持ちます。
2012年のGitHub公開からデファクトへ

jqはダブリン在住のソフトウェアエンジニア、スティーブン・ドランがGitHubで公開した個人プロジェクトとして始まりました。当時、CLIで扱えるJSONツールはまだ標準的なものがなく、「JSON時代のsed/awk」が欲しいという開発者の需要を素早く満たしたことで、公開直後から急速に注目を集めました。Hacker Newsで紹介されるたびにスターが伸び、各種Linuxディストリビューションの公式パッケージに収録され、数年で「JSONを扱うシェルスクリプトの定番」というポジションを確立します。
本家リポジトリは1.6リリース(2018年)以降、しばらくメンテナンスが停滞した時期がありましたが、ユーザーコミュニティが代替フォークやドキュメント整備を進めて使い続けられる状態を保ちました。2022年以降は新しいメンテナチームに引き継がれ、2023年には1.7がリリースされてSQL風機能、丸め関数、UTF-16処理など多くの改善が入りました。シンプルなDSLと膨大な利用実績が後押しとなり、現在もJSONをCLIで扱うときの第一選択であり続けています。
実務での使われ方

jqの最頻出の使い方は、curlやREST APIから返ってきたJSONレスポンスを一行で整形することです。「curl -s ... | jq '.items[] | {id, name}'」のような書き方で、必要な要素だけをタブ区切りに変換し、そのままawkやsortと組み合わせて集計に流せます。GitHubのIssue一覧やAWS APIの長大なレスポンスを扱うとき、jqがなければ可読性のある作業がほぼ成立しません。シェルスクリプトでAPI連携を組むときの中核ツールとして定着しています。
Kubernetes運用では「kubectl get pods -o json | jq '.items[].status.conditions'」のように、kubectlのカスタム出力では表現しにくい複雑な抽出をjqに任せるのが定番です。CI/CDではjqを使って前段ジョブの出力JSONを次段に渡したり、Terraformの状態ファイルから特定リソースを取り出したりします。構造化ログ(JSON Lines形式)の集計では、「jq -s 'group_by(.level) | map({level: .[0].level, count: length})'」のような式で、レベル別集計を一発で出せます。「JSONが絡んだら、まずjqを呼ぶ」という反射が定着するほどの存在感です。
yq・gron・fxとの位置関係

yqはミハイ・コンキシ(Mike Farah)が開発したツールで、jqのYAML版という位置づけから始まり、現在はYAML・JSON・XML・TOMLを横断的に扱えます。KubernetesマニフェストやCI設定がYAMLで書かれることが多いため、JSON以外も扱うならyqが便利ですが、純粋なJSON処理ではjqのほうが教材と性能面で安定しています。
gronはJSONを「.foo.bar = 1」のような平坦行形式に変換するユニークなツールで、grepしてからjqに戻すといった使い方が可能です。fxは対話的にJSONを探索するTUIツールで、ブラウズしながら式を組み立てたいときに便利です。また、Rust製のjaqはjqとほぼ互換のDSLを高速に処理する実装として注目されており、特に大規模JSONや起動回数の多いスクリプトで効果を発揮します。とはいえ、教材の量・ディストリビューションでの普及度・他者と共有しやすさという点で、jq以外をシェルスクリプトに書く理由は限定的で、「JSON処理の共通語」としての地位は今後も揺らぎにくいと見られます。
まとめ
jqはJSON時代におけるsed/awk相当の地位を確立した小さなDSLで、シェルスクリプトとAPI連携に不可欠なツールへ育ちました。依存なしの単一バイナリでどこにでも持ち込め、書ける式の幅も広いため、現代のサーバー作業に関わるすべての技術者にとって基本素養として身につけておきたい一本です。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント