GNU/Linux >> Linux の 問題 >  >> Linux

Linuxコマンドラインツールを使用してJSONを解析してきれいに印刷する方法

JSON は軽量で言語に依存しないデータストレージ形式であり、ほとんどのプログラミング言語との統合が容易であり、もちろん適切に形式化されている場合は人間が理解しやすいものです。 JSONという単語はJの略です ava S クリプトO bject N otationは、JavaScriptで始まり、主にサーバーとブラウザー間でデータを交換するために使用されますが、現在は組み込みシステムを含む多くの分野で使用されています。ここでは、Linuxのコマンドラインツールを使用してJSONを解析してきれいに印刷します。シェルスクリプトで大きなJSONデータを処理したり、シェルスクリプトでJSONデータを操作したりする場合に非常に便利です。

きれいな印刷とは何ですか?

JSONデータは、人間が読める形式になっています。ただし、ほとんどの場合、行末文字がなくても、JSONデータは1行に格納されます。

明らかに、それは手動で読んだり編集したりするのにあまり便利ではありません。

きれいなプリントが便利なのはその時です。名前は非常に自明であり、JSONテキストを人間が読みやすいように再フォーマットします。これはJSONプリティプリンティングとして知られています 。

Linuxでjqを使用してJSONを解析してきれいに印刷する

JSONデータは、 awkなどのコマンドラインテキストプロセッサで解析できます。 、 sed およびgerp 。実際、JSON.awkはそれを行うためのawkスクリプトです。ただし、同じ目的のための専用ツールがいくつかあります。

  1. jq またはjshon 、シェル用のJSONパーサー、どちらも非常に便利です。
  2. JSON.shのようなシェルスクリプト またはjsonv.sh JSONをbash、zsh、またはダッシュシェルで解析します。
  3. JSON.awk 、JSONパーサーawkスクリプト。
  4. json.toolなどのPythonモジュール 。
  5. underscore-cli 、Node.jsおよびjavascriptベース。

このチュートリアルでは、 jqのみに焦点を当てています。 、これは、高度なフィルタリングおよびスクリプト機能を備えたシェル用の非常に強力なJSONパーサーです。

JSONプリティプリンティング

JSONデータは1つにまとめられている可能性があり、人間にはほとんど判読できないため、ある程度読みやすくするために、JSONのきれいな印刷がここにあります。

例: jsonip.comからのデータ 、JSON形式で外部IPアドレスを取得するには、 curlを使用します またはwget 以下のようなツール。

$ wget -cq http://jsonip.com/ -O -

実際のデータは次のようになります:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

これで、jqできれいに印刷できます:

$ wget -cq http://jsonip.com/ -O - | jq '.'

結果をjqでフィルタリングすると、次のようになります。

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

同じことがpythonjson.toolでも実行できます モジュール。次に例を示します:

$ cat anything.json | python -m json.tool

このPythonベースのソリューションは、ほとんどのユーザーにとっては問題ないはずですが、組み込みシステムのように、Pythonがプリインストールされていないか、インストールできなかった場合はそれほど役に立ちません。

ただし、json.tool pythonモジュールには明確な利点があり、クロスプラットフォームです。そのため、Windows、Linux、またはMacOSでシームレスに使用できます。

推奨される読み物:

  • きれいにする–Pingコマンドの出力をより美しく読みやすくする

jqを使用してJSONを解析する方法

まず、jqをインストールする必要があります。これは、ほとんどのGNU / Linuxディストリビューションですでに使用されており、それぞれのパッケージインストーラーコマンドを使用してインストールします。

Arch Linuxの場合:

$ sudo pacman -S jq

Debian、Ubuntu、Linux Mintの場合:

$ sudo apt-get install jq

Fedoraの場合:

$ sudo dnf install jq

openSUSEの場合:

$ sudo zypper install jq

その他のOSまたはプラットフォームについては、公式のインストール手順をご覧ください。

jqの基本的なフィルターと識別子

jqはstdinからJSONデータを読み取ることができます またはファイル 。状況に応じて両方を使用する必要があります。

の単一の記号。 最も基本的なフィルターです。これらのフィルターは、オブジェクト識別子-インデックスとも呼ばれます。 。単一のを使用します。 jqと一緒に、基本的に入力JSONファイルをきれいに出力します。

一重引用符 -常に一重引用符を使用する必要はありません。ただし、1行に複数のフィルターを組み合わせる場合は、それらを使用する必要があります。

二重引用符 - @などの特殊文字を囲む必要があります 、 $ この例のように、2つの二重引用符で囲んで、jq.foo。"@bar"

生データの印刷 -何らかの理由で、二重引用符で囲まれていない、最終的に解析されたデータのみが必要な場合は、次のようにjqコマンドで-rフラグを使用します。 -jq -r .foo.bar

特定のデータの解析

JSONの特定の部分を除外するには、きれいに印刷されたJSONファイルのデータ階層を調べる必要があります。

ウィキペディアのJSONデータの例:

{

  "firstName": "John",

  "lastName": "Smith",

  "age": 25,

  "address": {

    "streetAddress": "21 2nd Street",

    "city": "New York",

    "state": "NY",

    "postalCode": "10021"

},

  "phoneNumber": [

{

  "type": "home",

  "number": "212 555-1234"

},

{

  "type": "fax",

  "number": "646 555-4567"

}

],

  "gender": {

  "type": "male"

  }

}

このチュートリアルでは、このJSONデータを例として使用し、これを sample.jsonとして保存します。 。

sample.jsonファイルからアドレスを除外したいとします。したがって、コマンドは次のようになります。

$ jq .address sample.json

出力例:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

ここでも、郵便番号が必要だとしましょう。次に、別のオブジェクト識別子-インデックスを追加する必要があります。 、つまり別のフィルター。

$ cat sample.json | jq .address.postalCode

フィルタでは大文字と小文字が区別されることにも注意してください nullではなく、まったく同じ文字列を使用して、意味のある出力を取得する必要があります。

JSON配列からの要素の解析

JSON配列の要素は角かっこで囲まれており、間違いなく非常に用途が広いです。

配列から要素を解析するには、[]識別子を使用する必要があります 他のオブジェクト識別子インデックスと一緒に。

このサンプルJSONデータでは、電話番号が配列内に格納されています。この配列からすべてのコンテンツを取得するには、この例のように角かっこのみを使用する必要があります。

$ jq .phoneNumber[] sample.json

配列の最初の要素だけが必要で、0から始まる配列オブジェクト番号を使用するとします。最初の項目には、 [0]を使用します。 、次の項目については、ステップごとに1つずつ増やす必要があります。

$ jq .phoneNumber[0] sample.json

スクリプトの例

JSON配列データ全体ではなく、ホームの番号のみが必要だとします。 jqコマンド内のスクリプトが便利な場合は次のようになります。

$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

ここでは、最初に1つのファイラーの結果を別のファイラーにパイプし、次にselect属性を使用して特定のタイプのデータを選択し、再び結果を別のフィルターにパイプします。

すべてのタイプのjqフィルターとスクリプトを説明することは、このチュートリアルの範囲と目的を超えています。下記の理解を深めるために、JQマニュアルを読むことを強くお勧めします。


Linux
  1. Linux上のFlatpak:それは何であり、それを使ってアプリをインストールする方法

  2. Linuxでファイルとディレクトリを圧縮する方法(例付き)

  3. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  1. Bashでプログラミングする方法:構文とツール

  2. LinuxターミナルでJSONファイルをきれいに印刷する方法

  3. Linux seq コマンドで IP アドレスの範囲を出力する方法

  1. Linuxでオープンソースツールを使用してStreamDeckを使用する方法

  2. LinuxでSUIDおよびSGID権限を持つファイルを検索する方法

  3. Linuxでユーザーとグループを操作する方法