Úvod
jq je lehký a flexibilní procesor JSON příkazového řádku.
jq je jako sed pro data JSON – můžete jej použít k rozdělení, filtrování, mapování a transformaci strukturovaných dat se stejnou lehkostí, jakou vám sed, awk, grep a friends umožňují hrát si s textem.
Také jq napsaný v přenosném C a nemá žádné závislosti na běhu. Můžete si stáhnout jeden binární soubor, scp ho na vzdálený počítač stejného typu a očekávat, že to bude fungovat.
jq dokáže změnit formát dat, který máte, do požadovaného formátu s velmi malým úsilím a program k tomu je často kratší a jednodušší, než byste očekávali.
V tomto článku se naučíme používat příkaz JQ k manipulaci a práci s daty JSON v prostředí Linux.
Nainstalujte příkaz JQ
Příkaz JQ není v některých distribucích Linuxu standardně dostupný; Před použitím je třeba jej stáhnout do systému. Příkaz JQ si můžete stáhnout stejně jako jakýkoli jiný balíček ve vašem systému. Na Ubuntu použijte níže uvedený příkaz k instalaci nástroje 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:~$
A použijte tento příkaz níže, pokud provozujete distribuci jako CentOS 8, která již má JQ ve výchozím nastavení, získáte výstup podobný tomuto:
sudo dnf install jq
Syntaxe
Podívejme se na syntaxi příkazu JQ:
jq [options] [file...]
jq [options] --args [strings...]
jq [options] --jsonargs [JSON_TEXTS...]
Uspořádejte data JSON pomocí příkazu JQ
JQ organizuje a upravuje data JSON při tisku na standardní výstup.
Takže v tomto příkladu máme soubor JSON s názvem unixcop.json a potřebujeme výstup dat na standardní výstup:
qadry@unixcop:~$ cat unixcop.json
{"product":{"name": "speaker","id": "123"}}
qadry@unixcop:~$
Data vytištěná na standardní výstup pomocí příkazu cat jsou neuspořádaná a chaotická. Tato data můžeme uspořádat pomocí příkazu JQ níže
qadry@unixcop:~$ jq '.' unixcop.json
{
"product": {
"name": "speaker",
"id": "123"
}
}
qadry@unixcop:~$
Nyní jsou data mnohem organizovanější a snáze srozumitelná. Tento filtr je zvláště potřebný při přístupu k datům z API; Data uložená v rozhraních API mohou být velmi neuspořádaná a matoucí.
Přístup k vlastnosti pomocí příkazu JQ
Pole . filtr spolu s příkazem JQ can_be použít k přístupu k vlastnosti objektu v shellu.
Můžeme použít .pole operátor. Například pro přístup k vlastnosti produktu můžeme použít tento příkaz:
qadry@unixcop:~$ jq '.product' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
K položkám přítomným ve vlastnosti můžeme také přistupovat pomocí .pole operátor. Pro přístup k položce názvu ve vlastnosti produktu použijeme:
qadry@unixcop:~$ jq '.product.name' unixcop.json
"speaker"
qadry@unixcop:~$
Přístup k položce pole pomocí příkazu JQ
Můžeme také přistupovat k prvkům přítomným v poli v souboru JSON a vytvářet jejich výstup pomocí .[] operátor. V tomto příkladu upravíme náš soubor JSON tak, aby vypadal takto:
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:~$
Pro výstup pouze druhého pole můžeme upravit 1 v operátoru pole na výše uvedený příkaz následujícím způsobem:
qadry@unixcop:~$ jq '.[1]' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
Poznámka :pole začíná na 0
Pokud chceme získat přístup k vlastnosti name ve třetím poli, spustíme následující příkaz:
qadry@unixcop:~$ jq '.[2].name' unixcop.json
"keyboard"
qadry@unixcop:~$
Také můžeme použít .[3] pro přístup ke 4. poli a zajistíme, že bude null.
qadry@unixcop:~$ jq '.[3].name' unixcop.json
null
qadry@unixcop:~$
Pro přístup ke všem vlastnostem názvu uvnitř polí můžeme také provést tento příkaz:
qadry@unixcop:~$ jq '.[].name' unixcop.json
"TV"
"speaker"
"keyboard"
qadry@unixcop:~$
Závěr
Příkaz JQ se používá k transformaci dat JSON do čitelnějšího formátu a jejich tisku na standardní výstup v systému Linux. Příkaz JQ je postaven na filtrech, které se používají k vyhledání a tisku pouze požadovaných dat ze souboru JSON.