はじめに
jqは、軽量で柔軟なコマンドラインJSONプロセッサです。
jqはJSONデータのsedに似ています。これを使用すると、sed、awk、grep、および友人がテキストで遊ぶのと同じくらい簡単に、構造化データをスライス、フィルタリング、マッピング、および変換できます。
また、jqはポータブルCで記述されており、実行時の依存関係はありません。単一のバイナリをダウンロードして、同じタイプの遠く離れたマシンにscpして、動作することを期待できます。
jqは、ごくわずかな労力で、使用しているデータ形式を必要な形式に変換できます。そのためのプログラムは、多くの場合、予想よりも短く、単純です。
この記事では、JQコマンドを使用してLinuxシェルでJSONデータを操作および操作する方法を学習します。
JQコマンドをインストールします
JQコマンドは、デフォルトでは一部のLinuxディストリビューションでは使用できません。使用する前に、システムにダウンロードする必要があります。 JQコマンドは、システム上の他のパッケージと同じようにダウンロードできます。 Ubuntuでは、以下のコマンドを使用してJQユーティリティをインストールします。
qadry@unixcop:~$ sudo apt install jq -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libreoffice-help-common
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
libjq1 libonig5
The following NEW packages will be installed:
jq libjq1 libonig5
0 upgraded, 3 newly installed, 0 to remove and 240 not upgraded.
Need to get 313 kB of archives.
After this operation, 1062 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 libonig5 amd64 6.9.4-1 [142 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libjq1 amd64 1.6-1ubuntu0.20.04.1 [121 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 jq amd64 1.6-1ubuntu0.20.04.1 [50.2 kB]
Fetched 313 kB in 2s (128 kB/s)
Selecting previously unselected package libonig5:amd64.
(Reading database ... 196337 files and directories currently installed.)
Preparing to unpack .../libonig5_6.9.4-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.4-1) ...
Selecting previously unselected package libjq1:amd64.
Preparing to unpack .../libjq1_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Selecting previously unselected package jq.
Preparing to unpack .../jq_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking jq (1.6-1ubuntu0.20.04.1) ...
Setting up libonig5:amd64 (6.9.4-1) ...
Setting up libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Setting up jq (1.6-1ubuntu0.20.04.1) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...#######################################################################################.........
qadry@unixcop:~$
また、デフォルトですでにJQを備えているCentOS 8のようなディストリビューションを実行している場合は、以下のコマンドを使用すると、次のような出力が得られます。
sudo dnf install jq
構文
JQコマンドの構文を見てみましょう:
jq [options] [file...]
jq [options] --args [strings...]
jq [options] --jsonargs [JSON_TEXTS...]
JQコマンドを使用してJSONデータを整理する
JQは、JSONデータを標準出力に出力するときに、JSONデータを整理してきれいにします。
したがって、この例では、unixcop.jsonという名前のJSONファイルがあり、データを標準出力に出力する必要があります。
qadry@unixcop:~$ cat unixcop.json
{"product":{"name": "speaker","id": "123"}}
qadry@unixcop:~$
catコマンドを使用して標準出力に出力されるデータは、整理されておらず、乱雑です。以下のJQコマンドを使用してこのデータを整理できます
qadry@unixcop:~$ jq '.' unixcop.json
{
"product": {
"name": "speaker",
"id": "123"
}
}
qadry@unixcop:~$
これで、データがより整理され、理解しやすくなりました。このフィルターは、APIからデータにアクセスするときに特に必要です。 APIに保存されているデータは、非常に整理されておらず、混乱を招く可能性があります。
JQコマンドを使用してプロパティにアクセスする
.field フィルタとJQコマンドを使用して、シェルのオブジェクトプロパティにアクセスできます。
.fieldを使用できます オペレーター。たとえば、商品のプロパティにアクセスするには、次のコマンドを使用できます:
qadry@unixcop:~$ jq '.product' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
.field を使用して、プロパティ内にあるアイテムにアクセスすることもできます。 オペレーター。商品のプロパティの名前アイテムにアクセスするには、次を使用します:
qadry@unixcop:~$ jq '.product.name' unixcop.json
"speaker"
qadry@unixcop:~$
JQコマンドを使用して配列アイテムにアクセスする
。[]を使用して、JSONファイルの配列内に存在する要素にアクセスして出力することもできます。 オペレーター。この例では、JSONファイルを次のように変更します。
qadry@unixcop:~$ cat unixcop.json
[{"name": "TV","id": "213"},{"name": "speaker","id": "123"},{"name": "keyboard","id": "432"}]
qadry@unixcop:~$ jq '.[]' unixcop.json
{
"name": "TV",
"id": "213"
}
{
"name": "speaker",
"id": "123"
}
{
"name": "keyboard",
"id": "432"
}
qadry@unixcop:~$
2番目の配列のみを出力するには、 1を変更できます。 配列演算子で上記のコマンドを次のように実行します:
qadry@unixcop:~$ jq '.[1]' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
注 :配列は0から始まります
3番目の配列のnameプロパティにアクセスする場合は、次のコマンドを実行します。
qadry@unixcop:~$ jq '.[2].name' unixcop.json
"keyboard"
qadry@unixcop:~$
また、。[3]を使用して4番目の配列にアクセスし、それがnullになることを確認します。
qadry@unixcop:~$ jq '.[3].name' unixcop.json
null
qadry@unixcop:~$
また、配列内のすべての名前プロパティにアクセスするには、次のコマンドを実行できます。
qadry@unixcop:~$ jq '.[].name' unixcop.json
"TV"
"speaker"
"keyboard"
qadry@unixcop:~$
結論
JQコマンドは、JSONデータをより読みやすい形式に変換し、Linuxの標準出力に出力するために使用されます。 JQコマンドは、JSONファイルから必要なデータのみを検索して出力するために使用されるフィルターを中心に構築されています。