Einführung
jq ist ein leichter und flexibler JSON-Befehlszeilenprozessor.
jq ist wie sed für JSON-Daten – Sie können damit strukturierte Daten mit der gleichen Leichtigkeit aufteilen, filtern, abbilden und transformieren, mit der Sie mit sed, awk, grep und Co. mit Text spielen können.
Auch jq in portablem C geschrieben und hat keine Laufzeitabhängigkeiten. Sie können eine einzelne Binärdatei herunterladen, sie auf eine weit entfernte Maschine des gleichen Typs scp und erwarten, dass sie funktioniert.
jq kann das Datenformat, das Sie haben, mit sehr wenig Aufwand in das gewünschte umwandeln, und das Programm dafür ist oft kürzer und einfacher, als Sie erwarten würden.
In diesem Artikel lernen wir, den JQ-Befehl zu verwenden, um JSON-Daten in einer Linux-Shell zu manipulieren und mit ihnen zu arbeiten.
Installieren Sie den JQ-Befehl
Der JQ-Befehl ist in einigen Linux-Distributionen standardmäßig nicht verfügbar; Es muss in das System heruntergeladen werden, bevor es verwendet werden kann. Sie können den JQ-Befehl wie jedes andere Paket auf Ihrem System herunterladen. Verwenden Sie unter Ubuntu den unten angegebenen Befehl, um das JQ-Dienstprogramm zu installieren:
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:~$
Und verwenden Sie diesen Befehl unten, wenn Sie eine Distribution wie CentOS 8 ausführen, die bereits standardmäßig JQ hat, dann erhalten Sie eine Ausgabe ähnlich der folgenden:
sudo dnf install jq
Syntax
Schauen wir uns die Syntax des JQ-Befehls an:
jq [options] [file...]
jq [options] --args [strings...]
jq [options] --jsonargs [JSON_TEXTS...]
JSON-Daten mit dem JQ-Befehl organisieren
JQ organisiert und verschönert JSON-Daten beim Drucken auf die Standardausgabe.
In diesem Beispiel haben wir also eine JSON-Datei namens unixcop.json und müssen die Daten an die Standardausgabe ausgeben:
qadry@unixcop:~$ cat unixcop.json
{"product":{"name": "speaker","id": "123"}}
qadry@unixcop:~$
Die Daten, die mit dem cat-Befehl auf die Standardausgabe gedruckt werden, sind unorganisiert und chaotisch. Wir können diese Daten organisieren, indem wir den folgenden JQ-Befehl verwenden
qadry@unixcop:~$ jq '.' unixcop.json
{
"product": {
"name": "speaker",
"id": "123"
}
}
qadry@unixcop:~$
Jetzt sind die Daten viel organisierter und leichter verständlich geworden. Dieser Filter wird besonders benötigt, wenn auf Daten von APIs zugegriffen wird; Die in APIs gespeicherten Daten können sehr unorganisiert und verwirrend sein.
Zugriff auf eine Eigenschaft mit dem JQ-Befehl
Das .Feld filter kann zusammen mit dem JQ-Befehl verwendet werden, um auf Objekteigenschaften in der Shell zuzugreifen.
Wir können das .field verwenden Operator. Um beispielsweise auf die Eigenschaften des Produkts zuzugreifen, können wir diesen Befehl verwenden:
qadry@unixcop:~$ jq '.product' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
Wir können auch auf die in der Eigenschaft vorhandenen Elemente zugreifen, indem wir das .field verwenden Operator. Um auf das Namenselement in der Eigenschaft des Produkts zuzugreifen, verwenden wir:
qadry@unixcop:~$ jq '.product.name' unixcop.json
"speaker"
qadry@unixcop:~$
Zugriff auf ein Array-Element mit dem JQ-Befehl
Wir können auch auf die in einem Array in einer JSON-Datei vorhandenen Elemente zugreifen und diese ausgeben, indem wir .[] verwenden Operator. Für dieses Beispiel ändern wir unsere JSON-Datei so, dass sie so aussieht:
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:~$
Um nur das zweite Array auszugeben, können wir 1 ändern im Array-Operator auf den oben angegebenen Befehl wie folgt:
qadry@unixcop:~$ jq '.[1]' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
Hinweis :Das Array beginnt bei 0
Wenn wir auf die Namenseigenschaft im dritten Array zugreifen möchten, führen wir den folgenden Befehl aus:
qadry@unixcop:~$ jq '.[2].name' unixcop.json
"keyboard"
qadry@unixcop:~$
Wir können auch .[3] verwenden, um auf das vierte Array zuzugreifen, und wir stellen sicher, dass es null ist.
qadry@unixcop:~$ jq '.[3].name' unixcop.json
null
qadry@unixcop:~$
Um auch auf alle Namenseigenschaften innerhalb von Arrays zuzugreifen, können wir diesen Befehl ausführen:
qadry@unixcop:~$ jq '.[].name' unixcop.json
"TV"
"speaker"
"keyboard"
qadry@unixcop:~$
Schlussfolgerung
Der JQ-Befehl wird verwendet, um JSON-Daten in ein besser lesbares Format umzuwandeln und sie auf der Standardausgabe unter Linux auszugeben. Der JQ-Befehl basiert auf Filtern, die verwendet werden, um nur die erforderlichen Daten aus einer JSON-Datei zu finden und zu drucken.