Hoe jq Command te gebruiken om JSON in Linux te verwerken
Jq is een krachtig en zeer flexibel parserprogramma dat JSON-gegevens uit bestanden en UNIX-pipes kan streamen en filteren. In dit artikel leert u de basisprincipes van jq, presenteert u codevoorbeelden en enkele alternatieve implementaties die u vandaag nog kunt installeren.
Waar wordt jq voor gebruikt?
Het meest voorkomende gebruik van jq is het verwerken en manipuleren van JSON-reacties van Software-as-a-Service (SaaS) API’s. U kunt bijvoorbeeld jq samen met cURL gebruiken om gebruik te maken van de API-eindpunten van Digitalocean om uw accountgegevens te verkrijgen.
Daarnaast is jq ook een krachtig hulpprogramma voor het beheren van grote JSON-bestanden. Enkele van de meest populaire databaseprogramma’s van vandaag, zoals MongoDB, PostgreSQL en MySQL, ondersteunen JSON als een manier om gegevens op te slaan. Als zodanig geeft het leren van jq u een voorsprong in het begrijpen hoe die databasesystemen werken.
Installeren en gebruiken jq
Om met jq te beginnen, installeert u het binaire pakket op uw systeem:
Zoek een open API-eindpunt waarop u jq kunt testen. In mijn geval ga ik de IP-checker-API van ipinfo.io gebruiken.
Het meest basale filter voor jq is het puntfilter (.). Dit zal het JSON-antwoord behoorlijk afdrukken zoals jq het ontving van de standaardinvoer:
Een ander basisfilter is het pijpsymbool (|). Dit is een speciaal filter dat de uitvoer van het ene filter doorgeeft als de invoer van een ander:
De waarde na de pipe-operator is de ‘Object Identifier-Index’. Hiermee wordt in uw JSON-invoer gezocht naar elke variabele die overeenkomt met de tekst en wordt de waarde ervan op de terminal afgedrukt. In dit geval zoek ik naar de waarde van de sleutel “ip:”.
Nu de basisbeginselen klaar zijn, laten de volgende secties u enkele van de trucs zien die u kunt doen met jq.
1. Een basisfeedlezer maken met jq
De meeste moderne websites bieden tegenwoordig open API-eindpunten voor het lezen van gegevens binnen hun platforms. Elke Github-repository heeft bijvoorbeeld zijn eigen API-URL waarmee u de nieuwste commits en problemen voor dat project kunt ophalen.
U kunt een dergelijk API-eindpunt met jq gebruiken om uw eigen eenvoudige “RSS-achtige” feed te maken. Gebruik om te beginnen cURL om te testen of het eindpunt correct werkt:
Voer het volgende uit om het eerste item in uw feed af te drukken:
Dit toont de verschillende velden die de Github API naar jq verzendt. U kunt deze gebruiken om uw eigen aangepaste JSON-object te maken door de invoer naar het accolades- {}
filter ( ) te leiden:
Door het kommafilter (,) binnen de accolades toe te voegen, kunt u meerdere velden aan uw aangepaste object toevoegen:
Als u de “0” binnen de vierkante haakjes verwijdert, wordt uw jq-filter op de gehele feed toegepast:
Je kunt ook een klein Bash-script maken om de nieuwste nummers van je favoriete Github-project weer te geven. Plak het volgende codeblok in een leeg shellscriptbestand:
Sla uw bestand op en voer vervolgens de volgende opdracht uit om het uitvoerbaar te maken:
Test uw nieuwe feedlezer door het nieuwste nummer in uw favoriete Github-repository op te nemen:
2. Een JSON-database lezen en doorzoeken
Naast het lezen van gegevens van API’s, kunt u jq ook gebruiken om JSON-bestanden op uw lokale machine te beheren. Begin met het maken van een eenvoudig JSON-databasebestand met uw favoriete teksteditor:
Plak het volgende gegevensblok in uw bestand en sla het vervolgens op:
Test of jq uw JSON-bestand correct leest door het eerste object in uw databasearray af te drukken:
Voer een query uit op uw JSON-database met behulp van het filter “Object Identifier-Index”. In mijn geval zoek ik naar de waarde van de sleutel “.name” bij elk item in mijn database:
U kunt ook enkele van de ingebouwde functies van jq gebruiken om uw zoekopdrachten te filteren op basis van bepaalde kwaliteiten. U kunt bijvoorbeeld alle JSON-objecten zoeken en afdrukken die een “.name”-waarde hebben met meer dan zes tekens:
Werkt op JSON-databases met jq
Daarnaast kan jq werken op JSON-databases, vergelijkbaar met een standaardspreadsheet. Met de volgende opdracht wordt bijvoorbeeld het totaal van de “.balance”-sleutel afgedrukt voor elk object in de database:
U kunt dit zelfs uitbreiden door een voorwaardelijke verklaring aan uw zoekopdracht toe te voegen. Het volgende voegt alleen de “.balance” toe als de “.name” waarde van het tweede object “Alice” is:
Het is mogelijk om variabelen tijdelijk uit uw JSON-database te verwijderen. Dit kan handig zijn als u uw filter test en er zeker van wilt zijn dat uw gegevensset nog steeds kan worden verwerkt:
U kunt ook nieuwe variabelen in uw database invoegen met behulp van de operator “+”. De volgende regel voegt bijvoorbeeld de variabele “active: true” toe aan het eerste object in de database:
3. Niet-JSON-gegevens transformeren in jq
Een ander briljant kenmerk van jq is dat het niet-JSON-gegevens kan accepteren en ermee kan werken. Om dat te bereiken gebruikt het programma een alternatieve ‘slurpmodus’, waarbij het alle door spaties en nieuwe regels gescheiden gegevens omzet in een JSON-array.
U kunt deze functie inschakelen door gegevens met een -s
vlag naar jq te leiden:
Een voordeel van het converteren van uw onbewerkte gegevens naar een array is dat u ze kunt adresseren met behulp van array-indexnummers. Met de volgende opdracht worden twee waarden toegevoegd door te verwijzen naar hun geconverteerde arraylocatie:
U kunt deze arraylocatie verder uitbreiden en er nieuwe JSON-code omheen construeren. Deze code converteert bijvoorbeeld de tekst van het echo-commando naar een JSON-object via het accoladesfilter:
Naast het opnemen van onbewerkte gegevens, kan jq ook niet-JSON-gegevens als uitvoer retourneren. Dit is handig als u jq gebruikt als onderdeel van een groter shellscript en u alleen het resultaat van de filters nodig heeft.
Om dat te doen, voert u jq uit, gevolgd door de -r
vlag. De volgende opdracht leest bijvoorbeeld alle namen uit mijn databasebestand en retourneert deze als platte tekstgegevens:
Alternatieve JSON-parsers voor jq
Omdat de code voor jq open source is, hebben verschillende ontwikkelaars hun eigen versies van de JSON-parser gemaakt. Elk van deze heeft zijn eigen unieke verkoopargument dat een kernonderdeel van jq verbetert of verandert.
1 vind-ik-leuk
Jaq is een krachtige JSON-parser die een vrijwel identieke functieset biedt als jq.
Geschreven in Rust, een van de grootste verkoopargumenten van Jaq is dat het de jq-taal tot 30 keer sneller kan uitvoeren dan de originele parser, terwijl het toch achterwaartse compatibiliteit behoudt. Dit alleen al maakt het waardevol als u grote jq-filters gebruikt en u de prestaties van uw machine wilt maximaliseren.
Dat gezegd hebbende, is een nadeel van jaq dat het momenteel niet beschikbaar is in de repository’s van Debian, Ubuntu en Fedora. De enige manier om het te verkrijgen is door Homebrew te downloaden of door het vanaf de broncode te compileren.
2. Ga
Gojq is een alternatieve JSON-parser die volledig in Go is geschreven. Het biedt een toegankelijke en eenvoudig te gebruiken versie van jq die u op vrijwel elk platform kunt installeren.
Het originele jq-programma kan ongelooflijk beknopt zijn in zijn foutmeldingen. Als gevolg hiervan is het debuggen van jq-scripts vooral moeilijk voor een nieuwe jq-gebruiker. Gojq lost dit probleem op door u te laten zien waar de fout in uw script zit en door gedetailleerde berichten te geven over het soort fout dat is opgetreden.
Een ander verkoopargument van gojq is dat het zowel JSON- als YAML-bestanden kan lezen en verwerken. Dit kan vooral handig zijn als u een Docker- en Docker Compose-gebruiker bent en uw implementatieworkflow wilt automatiseren.
Het grootste probleem van Gojq is dat het een aantal van de functies heeft verwijderd die standaard aanwezig zijn in de originele jq-parser. Opties zoals --ascii-output
, --seq
, en --sort-keys
bestaan bijvoorbeeld niet op gojq.
3. fq
In tegenstelling tot jaq en gojq is fq een uitgebreide softwaretoolkit die zowel tekst als binaire gegevens kan ontleden. Het kan werken met een verscheidenheid aan populaire formaten zoals JSON, YAML, HTML en zelfs FLAC.
Het grootste kenmerk van fq is dat het een ingebouwde hex-lezer voor bestanden bevat. Dit maakt het triviaal om naar de interne structuur van een bestand te kijken om te bepalen hoe het is gemaakt en of er iets mis mee is. Afgezien daarvan gebruikt fq ook dezelfde syntaxis voor jq bij het omgaan met tekst, wat het gemakkelijk maakt om te leren voor iedereen die al bekend is met jq.
Een nadeel van dit ambitieuze doel is dat fq nog steeds volop in ontwikkeling is. Als zodanig zijn sommige functies en gedragingen van het programma nog steeds onderhevig aan ingrijpende veranderingen.
Het verkennen van jq, hoe het werkt en wat het speciaal maakt, is slechts de eerste stap in het leren maken van programma’s op uw computer. Duik diep in de wondere wereld van coderen door de basisprincipes van shell-programmeren te lezen.
Afbeelding tegoed: Ferenc Almasi via Unsplash . Alle wijzigingen en screenshots door Ramces Red.
Geef een reactie