Linux で jq コマンドを使用して JSON を処理する方法

Linux で jq コマンドを使用して JSON を処理する方法
JSON ファイルを表示しているモニターの写真。

jq は、ファイルや UNIX パイプから JSON データをストリーミングおよびフィルター処理できる、強力で柔軟性の高いパーサー プログラムです。この記事では、jq の基礎、コード例、および今すぐインストールできるいくつかの代替実装について説明します。

jq は何に使用されますか?

jqの最も一般的な用途は、Software-as-a-Service (SaaS) API からの JSON 応答を処理および操作することです。たとえば、jq を cURL と一緒に使用して、Digitalocean の API エンドポイントにアクセスし、アカウントの詳細を取得できます。

Digitalocean から jq へのサンプル API アクセスを示すターミナル。

それ以外にも、jq は大きな JSON ファイルを管理するための強力なユーティリティでもあります。MongoDB、PostgreSQL、MySQL など、現在最も人気のあるデータベース プログラムの一部は、データを保存する方法として JSON をサポートしています。そのため、jq を学習すると、これらのデータベース システムの仕組みを理解する上で有利になります。

jqのインストールと使用

jq を使い始めるには、バイナリ パッケージをシステムにインストールします。

jq をテストできるオープン API エンドポイントを見つけます。私の場合は、ipinfo.io の IP チェッカー API を使用します。

Jq Json Linux 02 Ipinfo Saas Web サイトを使用する

jq の最も基本的なフィルターはドット (.) フィルターです。これにより、jq が標準入力から受け取った JSON 応答がきれいに印刷されます。

もう 1 つの基本的なフィルターはパイプ (|) 記号です。これは、1 つのフィルターの出力を別のフィルターの入力として渡す特別なフィルターです。

パイプ演算子の後の値は「オブジェクト識別子インデックス」です。これは、JSON 入力でテキストに一致する変数を検索し、その値を端末に出力します。この場合、「ip:」キーの値を検索しています。

jq を介して ipinfo SaaS API のフィルタリングされた出力を表示するターミナル。

基本的なことは完了しましたので、次のセクションでは、jq を使用して実行できるいくつかのトリックを紹介します。

1. jq を使用した基本的なフィードリーダーの作成

今日の最新の Web サイトのほとんどは、プラットフォーム内のデータを読み取るためのオープン API エンドポイントを提供しています。たとえば、すべての Github リポジトリには、そのプロジェクトの最新のコミットと問題を取得するための独自の API URL があります。

デフォルトを表示する端末

jq で次のような API エンドポイントを使用して、独自のシンプルな「RSS のような」フィードを作成できます。まず、cURL を使用してエンドポイントが正しく動作しているかどうかをテストします。

フィードの最初のエントリを印刷するには、次のコマンドを実行します。

これにより、Github API が jq に送信するさまざまなフィールドが表示されます。これらを使用して、入力を中括弧 ( {}) フィルターにパイプすることで、独自のカスタム JSON オブジェクトを作成できます。

中括弧内にカンマ (,) フィルターを追加すると、カスタム オブジェクトに複数のフィールドを追加できます。

Github API からカスタム削除された JSON オブジェクトを表示するターミナル。

角括弧内の「0」を削除すると、jq フィルターがフィード全体に適用されます。

お気に入りの Github プロジェクトの最新の問題を表示する小さな Bash スクリプトを作成することもできます。次のコード ブロックを空のシェル スクリプト ファイル内に貼り付けます。

ファイルを保存し、次のコマンドを実行して実行可能にします。

お気に入りの Github リポジトリの最新の問題をリストして、新しいフィード リーダーをテストします。

カスタム スクリプトが動作し、最新の Github の問題を印刷しているターミナル。

2. JSONデータベースの読み取りと検索

API からデータを読み取る以外にも、jq を使用してローカル マシンで JSON ファイルを管理することもできます。まずは、お気に入りのテキスト エディターを使用して、簡単な JSON データベース ファイルを作成します。

次のデータ ブロックをファイル内に貼り付けて保存します。

データベース配列の最初のオブジェクトを出力して、jq が JSON ファイルを適切に読み取るかどうかをテストします。

jq が JSON データベースの最初のエントリを印刷しているターミナル。

「オブジェクト識別子-インデックス」フィルターを使用して、JSON データベースにクエリを実行します。私の場合は、データベース内のすべてのエントリで「.name」キーの値を検索しています。

jq の組み込み関数のいくつかを使用して、特定の品質に基づいてクエリをフィルタリングすることもできます。たとえば、6 文字を超える「.name」値を持つすべての JSON オブジェクトを検索して出力できます。

名前の長さの制約がある jq の出力を表示する端末。

jq を使用した JSON データベースの操作

さらに、jq は基本的なスプレッドシートと同様に JSON データベースを操作できます。たとえば、次のコマンドは、データベース内のすべてのオブジェクトの「.balance」キーの合計を出力します。

クエリに条件文を追加することで、これを拡張することもできます。次の例では、2 番目のオブジェクトの「.name」値が「Alice」の場合にのみ「.balance」が追加されます。

データベース上で実行されている jq の条件文を表示するターミナル。

JSON データベースから変数を一時的に削除することができます。これは、フィルターをテストしていて、データセットを処理できるかどうかを確認したい場合に便利です。

名前 JSON キーのない 2 番目のエントリを表示する端末。

「+」演算子を使用して、データベースに新しい変数を挿入することもできます。たとえば、次の行は、データベースの最初のオブジェクトに変数「active: true」を追加します。

最初のデータベース エントリの追加のキー値を表示する端末。

3. jq での非 JSON データの変換

jq のもう 1 つの優れた機能は、JSON 以外のデータを受け入れて操作できることです。これを実現するために、プログラムは代替の「スラープ モード」を使用して、スペースと改行で区切られたデータを JSON 配列に変換します。

フラグを使用してデータを jq にパイプすることで、この機能を有効にすることができます-s

JSON 配列に変換されたテキスト文字列を表示する端末。

生データを配列に変換する利点の 1 つは、配列のインデックス番号を使用してデータにアドレス指定できることです。次のコマンドは、変換された配列の場所を参照して 2 つの値を追加します。

この配列の場所をさらに利用して、その周りに新しい JSON コードを構築することができます。たとえば、次のコードは、中括弧フィルターを使用して echo コマンドのテキストを JSON オブジェクトに変換します。

サンプル データベースの形式でカスタム JSON オブジェクトを表示するターミナル。

jq は、生データを取り込むだけでなく、出力として非 JSON データを返すこともできます。これは、jq を大規模なシェル スクリプトの一部として使用していて、フィルターからの結果のみが必要な場合に便利です。

それを実行するには、フラグの後に jq を実行します-r。たとえば、次のコマンドはデータベース ファイルからすべての名前を読み取り、プレーン テキスト データとして返します。

フォーマットを削除したデータベースの名前のリストを表示する端末。

jq の代替 JSON パーサー

jq のコードはオープンソースであるため、さまざまな開発者が独自のバージョンの JSON パーサーを作成しています。これらにはそれぞれ独自のセールスポイントがあり、jq のコア部分を改良または変更しています。

1.いいね

Jaqは、jq とほぼ同じ機能セットを提供する強力な JSON パーサーです。

Rust で書かれた Jaq の最大のセールス ポイントの 1 つは、下位互換性を維持しながら、元のパーサーよりも最大 30 倍高速に jq 言語を実行できることです。これだけでも、大規模な jq フィルターを実行していて、マシンのパフォーマンスを最大化したい場合に価値があります。

サンプル データベースで jaq が実行されていることを示すターミナル。

とはいえ、jaq の欠点の 1 つは、現在 Debian、Ubuntu、Fedora のリポジトリでは利用できないことです。入手するには、Homebrew をダウンロードするか、ソースからコンパイルするしかありません。

2. 行く

Gojq は、完全に Go で記述された代替 JSON パーサーです。ほぼすべてのプラットフォームにインストールできる、アクセスしやすく使いやすいバージョンの jq を提供します。

オリジナルの jq プログラムは、エラー メッセージが驚くほど簡潔です。そのため、jq スクリプトのデバッグは、jq の初心者にとっては特に困難です。Gojq は、スクリプトのどこに間違いがあるのか​​を示し、発生したエラーの種類に関する詳細なメッセージを提供することで、この問題を解決します。

gojq 用に読み込まれたサンプル データベースを表示する端末。

gojq のもう 1 つのセールス ポイントは、JSON ファイルと YAML ファイルの両方を読み取って処理できることです。これは、Docker および Docker Compose ユーザーであり、デプロイメント ワークフローを自動化したい場合に特に役立ちます。

Gojq の最大の問題は、元の jq パーサーにデフォルトで付属している機能の一部が削除されたことです。たとえば、、などのオプションは--ascii-outputgojq--seq--sort-keysは存在しません。

3. 質問

jaq や gojq とは異なり、fq はテキストとバイナリ データの両方を解析できる包括的なソフトウェア ツールキットです。JSON、YAML、HTML、さらには FLAC など、さまざまな一般的な形式で動作します。

サンプル データベース ファイルを読み取っている fq を示す端末。

fq の最大の特徴は、ファイル用の 16 進リーダーが組み込まれていることです。これにより、ファイルの内部構造を調べて、ファイルがどのように作成されているか、また、ファイルに問題がないかを確認することが簡単になります。それだけでなく、fq はテキストを処理するときに jq と同じ構文を使用するため、jq にすでに慣れている人にとっては簡単に習得できます。

この野心的な目標の欠点の 1 つは、fq がまだ開発中であることです。そのため、プログラムの機能や動作の一部は、依然として大幅な変更の対象となっています。

jq の仕組みや特別な点について調べることは、コンピューターでプログラムを作成する方法を学ぶための第一歩にすぎません。シェル プログラミングの基礎を読んで、コーディングの素晴らしい世界を深く探ってみましょう。

画像クレジット: Ferenc Almasi (Unsplash 経由)。すべての変更とスクリーンショットは Ramces Red によるものです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です