GNU/Linux >> Znalost Linux >  >> Linux

Jak analyzovat a pěkně tisknout JSON pomocí nástrojů příkazového řádku Linuxu

JSON je lehký a jazykově nezávislý formát pro ukládání dat, který lze snadno integrovat s většinou programovacích jazyků a je také snadno pochopitelný pro lidi, samozřejmě při správném formátování. Slovo JSON znamená J avaS kript O bjekt N otace, i když začíná JavaScriptem a primárně se používá k výměně dat mezi serverem a prohlížečem, ale nyní se používá v mnoha oblastech včetně vestavěných systémů. Zde analyzujeme a pěkně vytiskneme JSON pomocí nástrojů příkazového řádku v Linuxu. Je to extrémně užitečné pro práci s velkými daty JSON ve skriptech shellu nebo pro manipulaci s daty JSON ve skriptu shellu.

Co je pěkný tisk?

Data JSON jsou strukturována tak, aby byla pro člověka o něco čitelnější. Ve většině případů jsou však data JSON uložena na jednom řádku, a to i bez znaku na konci řádku.

To samozřejmě není příliš vhodné pro ruční čtení a úpravy.

Tehdy je pěkný tisk užitečný. Název je zcela samozřejmý, přeformátuje text JSON tak, aby byl pro lidi čitelnější. Toto je známé jako Pěkný tisk JSON .

Analyzujte a pěkně vytiskněte JSON pomocí jq v linuxu

Data JSON lze analyzovat pomocí textových procesorů příkazového řádku, jako je awk , sed a gerp . JSON.awk je ve skutečnosti awk skript, který to dělá. Existují však některé specializované nástroje pro stejný účel.

  1. jq nebo jshon , JSON parser pro shell, oba jsou docela užitečné.
  2. Skripty prostředí jako JSON.sh nebo jsonv.sh analyzovat JSON v bash, zsh nebo dash shell.
  3. JSON.awk , awk skript analyzátoru JSON.
  4. Moduly Pythonu jako json.tool .
  5. podtržítko-cli , Node.js a javascript založené.

V tomto tutoriálu se zaměřuji pouze na jq , což je poměrně výkonný analyzátor JSON pro shelly s pokročilými možnostmi filtrování a skriptování.

Krásný tisk JSON

Data JSON mohou být v jednom a pro lidi téměř nečitelná, takže aby byla trochu čitelná, je zde pěkný tisk JSON.

Příklad: Údaje z jsonip.com , pro získání externí IP adresy ve formátu JSON použijte curl nebo wget nástroje jako níže.

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

Skutečná data vypadají takto:

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

Nyní si to pěkně vytiskněte pomocí jq:

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

Po filtrování výsledku pomocí jq by to mělo vypadat jako níže.

{

   "ip": "111.222.333.444",

   "about": "/about",

   "Pro!": "http://getjsonip.com"

}

Totéž lze udělat s pythonem json.tool modul. Zde je příklad:

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

Toto řešení založené na Pythonu by mělo být vhodné pro většinu uživatelů, ale není tak užitečné, pokud Python není předinstalovaný nebo jej nelze nainstalovat, jako na vestavěné systémy.

Nicméně modul json.tool python má výraznou výhodu, je to multiplatformní. Můžete jej tedy bezproblémově používat na Windows, Linux nebo Mac OS.

Doporučené čtení:

  • Předpisování – výstup příkazu Ping bude hezčí a snáze čitelný

Jak analyzovat JSON pomocí jq

Nejprve musíte nainstalovat jq, je již vybráno většinou distribucí GNU/Linux, nainstalujte jej pomocí příslušných příkazů instalačního programu balíčků.

Na Arch Linuxu:

$ sudo pacman -S jq

V systémech Debian, Ubuntu, Linux Mint:

$ sudo apt-get install jq

Na Fedoře:

$ sudo dnf install jq

Na openSUSE:

$ sudo zypper install jq

Pro ostatní OS nebo platformy viz oficiální instalační pokyny.

Základní filtry a identifikátory jq

jq mohl číst data JSON buď z stdin nebo soubor . V závislosti na situaci musíte použít obojí.

Jediný symbol . je nejzákladnější filtr. Tyto filtry se také nazývají index identifikátoru objektu . Pomocí jednoho . spolu s jq v podstatě pěkně vytiskne vstupní soubor JSON.

Jednoduché uvozovky - Nemusíte vždy používat jedinou uvozovku. Pokud však kombinujete několik filtrů v jednom řádku, musíte je použít.

Dvojité uvozovky - Musíte přiložit jakýkoli speciální znak, jako je @ , # , $ ve dvou dvojitých uvozovkách, jako je tento příklad, jq .foo."@bar"

Tisk nezpracovaných dat - Z jakéhokoli důvodu, pokud potřebujete pouze konečná analyzovaná data, která nejsou uzavřena v uvozovkách, použijte parametr -r s příkazem jq, jako je tento. - jq -r .foo.bar .

Analyzovat konkrétní data

Chcete-li odfiltrovat konkrétní část JSON, musíte se podívat do pěkně vytištěné datové hierarchie souboru JSON.

Příklad dat JSON z Wikipedie:

{

  "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"

  }

}

Tato data JSON použiji jako příklad v tomto tutoriálu, uložím to jako sample.json .

Řekněme, že chci odfiltrovat adresu ze souboru sample.json. Příkaz by tedy měl být takto:

$ jq .address sample.json

Ukázkový výstup:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

Znovu řekněme, že chci PSČ, pak musím přidat další index identifikátoru objektu , tedy jiný filtr.

$ cat sample.json | jq .address.postalCode

Všimněte si také, že filtry rozlišují velká a malá písmena a musíte použít přesně stejný řetězec, abyste získali něco smysluplného výstupu místo null.

Analyzovat prvky z pole JSON

Prvky pole JSON jsou uzavřeny v hranatých závorkách, jejich použití je bezpochyby velmi univerzální.

Chcete-li analyzovat prvky z pole, musíte použít []identifikátor spolu s dalším identifikátorem objektu-index.

V těchto ukázkových datech JSON jsou telefonní čísla uložena uvnitř pole, abyste získali veškerý obsah z tohoto pole, musíte použít pouze hranaté závorky, jako je tento příklad.

$ jq .phoneNumber[] sample.json

Řekněme, že chcete pouze první prvek pole, pak použijte čísla objektů pole začínající 0, pro první položku použijte [0] , u dalších položek by se měl každý krok zvýšit o jednu.

$ jq .phoneNumber[0] sample.json

Příklady skriptování

Řekněme, že chci pouze číslo pro domov, ne celá data pole JSON. Zde se hodí skriptování v příkazu jq.

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

Zde nejprve převádím výsledky jednoho filtru do druhého, poté pomocí atributu select vyberu konkrétní typ dat a výsledek opět převádím do jiného filtru.

Vysvětlení každého typu jq filtrů a skriptování přesahuje rozsah a účel tohoto tutoriálu. Důrazně doporučujeme přečíst si níže uvedený manuál JQ pro lepší pochopení.


Linux
  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Flatpak na Linuxu:Co to je a jak s ním instalovat aplikace

  3. Jak vytisknout rozsah IP adres pomocí příkazu Linux seq

  1. Jak najít soubory s oprávněními SUID a SGID v Linuxu

  2. Jak komprimovat soubory a adresáře v systému Linux (s příklady)

  3. Jak pěkně vytisknout soubor JSON v terminálu Linux

  1. Jak používám Stream Deck na Linuxu s open source nástroji

  2. Jak pracovat s uživateli a skupinami v Linuxu

  3. Jak analyzovat Json pomocí skriptování Shell v Linuxu?