Jak przeanalizować plik JSON z linii poleceń Linux za pomocą JQ

Jak przeanalizować plik JSON z linii poleceń Linux za pomocą JQ

JSON (Notacja obiektu JavaScript) Format jest powszechnie używany do reprezentowania struktur danych i jest często używany do wymiany danych między różnymi warstwami aplikacji lub za pomocą wywołań API. Prawdopodobnie wiemy, jak wchodzić w interakcje z danymi formatowanymi przez JSON z najczęściej używanymi językami programowania, takimi jak parsing JSON z Pythonem, ale co jeśli musimy z nim interakcja z wiersza poleceń lub w skrypcie Bash? W tym artykule zobaczymy, w jaki sposób możemy wykonać takie zadanie, używając JQ użyteczność i poznamy jego podstawowe użycie.

W tym samouczku nauczysz się:

  • Jak zainstalować JQ w najczęściej używanych rozkładach Linux lub skompiluj go ze źródła
  • Jak używać JQ do analizowania danych formatowanych JSON
  • Jak łączyć filtry za pomocą „” i „|”
  • Jak używać długości, kluczy, ma funkcje i mapy



Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny od rozkładu
Oprogramowanie Aplikacja JQ
Inny Znajomość danych JSON i powłoki Bash
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Instalacja

JQ Narzędzie jest zawarte we wszystkich głównych repozytoriach Linux dystrybucji, dlatego instalowanie jej jest bardzo łatwe: musimy tylko skorzystać z naszego ulubionego menedżera pakietów. Jeśli używamy Debiana lub dystrybucji opartej na debian, takiej jak Ubuntu lub Linux Mint, możemy użyć trafny:

$ sudo apt instal JQ


Jeśli mamy preferencję dla rodziny dystrybucji Red Hat, takiej jak Fedora, CentOS lub RHEL, możemy zainstalować JQ za pośrednictwem DNF Menedżer pakietów (w najnowszych wersjach tych dystrybucji, które zastąpił Yum). Aby zainstalować pakiet, uruchomimy:

$ sudo dnf instaluj JQ

Instalowanie JQ na Archlinux jest równie łatwe. Menedżer pakietu dystrybucji to Pacman, a pakiet jest dostępny w repozytorium społeczności. Możemy wykonać instalację za pomocą następującego polecenia:

$ sudo pacman -s instaluj JQ

Jeśli nie możemy lub z jakiegoś powodu nie chcemy używać gotowego pakietu binarnego, możemy skompilować JQ ze źródła. W
Następujące wiersze opisujemy potrzebne kroki.

Budowanie i instalacja ze źródła

Aby zbudować i zainstalować JQ ze źródła, pierwszą rzeczą, którą musimy zrobić, jest pobranie wydania Tarball. W momencie
pisząc, najnowsze dostępne wydanie to 1.6. Aby pobrać Tarball bez opuszczania terminalu, możemy użyć wget:

$ wget https: // github.com/stedolan/jq/remises/pobierz/jq-1.6/JQ-1.6.smoła.GZ

Po zakończeniu pobierania musimy zdekompresować i wyodrębnić Tarball:

$ tar -xzf JQ -1.6.smoła.GZ

Następnym krokiem jest wejście do JQ-1.6 katalog, utworzony w wyniku ostatniego polecenia:

$ CD JQ-1.6

Teraz, aby skompilować kod źródłowy, potrzebujemy następujących narzędzi:

  • GCC
  • Automake
  • libtool
  • robić

Aby zbudować oprogramowanie, które prowadzimy:

$ autoreConf -fi $ ./konfiguruj && make && sudo tworzy instalację 
Kopiuj

Zrób instalację polecenie domyślnie spowoduje zainstalowanie plików binarnych w /usr/lokalny/bin katalog i biblioteki w /USR/Local/Lib. Jeśli chcemy dostosować instalację i zmienić te katalogi, musimy określić inny prefiks, używając --prefiks Opcja podczas uruchamiania ./skonfiguruj scenariusz.

Na przykład, aby zainstalować oprogramowanie tylko dla konkretnego użytkownika, moglibyśmy przekazać $ Home/.lokalny katalog jako prefiks: w takim przypadku binaria zostaną zainstalowane w $ Home/.lokalny/kosz i biblioteki do $ Home/.Lokalny/Lib; Przy takiej konfiguracji nie byłoby potrzeby uruchamiania Zrób instalację Polecenie z przywilejami administracyjnymi. Jeśli chcesz wiedzieć, jak lepiej organizować oprogramowanie zainstalowane źródło formularza, możesz sprawdzić nasz artykuł na temat narzędzia GNU Stow.

Stosowanie

Kiedyś JQ Zainstalowane możemy użyć go do analizowania plików JSON z wiersza poleceń. Ze względu na ten samouczek będziemy pracować z prostą strukturą danych, która zawiera kilka szczegółów na temat trzech znaków z książki Lord of the Rings. Dane są zapisywane na postacie.JSON plik.

JQ Działania narzędziowe poprzez stosowanie filtrów na strumieniu danych JSON. Jako pierwszą rzeczą, użyjemy najprostszego filtra, ., który zwraca dane wejściowe niezmienione, ale dość wydrukowane. W przypadku tej cechy można go używać do formatowania danych w bardziej czytelny sposób:

$ JQ . postacie.JSON

Polecenie powyżej daje następujące dane wyjściowe:

„Postacie”: [„name”: „Aragorn”, „rasa”: „man”, „nazwa”: „gimli”, „rasa”: „krasnolud”, „name”: „legoolas” , „rasa”: „elf”] 
Kopiuj

Załóżmy teraz, że chcemy odfiltrować dane, aby uzyskać tylko wartość powiązaną z postacie klucz. Aby wykonać zadanie, podajemy nazwę klucza i uzyskujemy jego wartość (lub zero Jeśli to nie istnieje):

$ JQ .Postacie postaci.JSON

W naszym przykładzie wartość powiązana z kluczem „znaków” jest szyk, Dlatego uzyskujemy następujący wynik:

[„Nazwa”: „Aragorn”, „rasa”: „man”, „nazwa”: „gimli”, „rasa”: „krasnolud”, „name”: „legoolas”, „rasa”: „elf”]
Kopiuj

Co jeśli chcemy uzyskać tylko pierwszy element tablicy? Musimy tylko „wyodrębnić” odpowiedni wskaźnik z niego. Wiedząc, że tablice są Zero, Możemy uruchomić:

$ JQ .znaki [0] znaki.JSON


Polecenie daje nam:

„Nazwa”: „Aragorn”, „Race”: „Man” 
Kopiuj

Możemy również uzyskać kawałek tablicy. Powiedzmy na przykład, chcemy uzyskać tylko pierwsze dwa elementy. Biegniemy:

$ JQ .znaki [0: 2] znaki.JSON

Polecenie daje nam następujący wynik:

[„Nazwa”: „Aragorn”, „rasa”: „man”, „nazwa”: „gimli”, „rasa”: „krasnolud”]] 
Kopiuj

Krojenie działa również na strunach, więc jeśli uruchomimy:

$ JQ .Znaki [0].Nazwa [0: 2] znaki.JSON

Otrzymujemy kawałek (pierwsze dwie litery) ciąg „Aragorn”: „AR”.

Uzyskaj dostęp do elementów tablicy osobno

W powyższych przykładach wydrukowaliśmy zawartość tablicy „znaków”, która składa się z trzech obiektów opisujących postacie fantasy. Co jeśli chcemy iterować nad wspomnianą tablicą? Musimy zrobić, aby elementy zawarte w nim były zwracane osobno, więc musimy użyć [] [] bez dostarczenia żadnego indeksu:

$ JQ .postacie [] postacie.JSON

Dane wyjściowe polecenia to:

„Nazwa”: „Aragorn”, „rasa”: „Man” „Nazwa”: „gimli”, „rasa”: „krasnolud”, „broń”: „ax” „nazwa”: „legolas” , „rasa”: „elf” 
Kopiuj

W takim przypadku uzyskaliśmy 3 wyniki: obiekty zawarte w tablicy. Tę samą technikę można zastosować do iteracji wartości obiektu, w tym przypadku pierwsza zawarta w tablicy „znaków”:

$ JQ .znaki [0] [] znaki.JSON

Tutaj uzyskujemy następujący wynik:

„Aragorn” „Człowiek” 
Kopiuj

„” I „|” operatorzy

„” I „|” Obaj operatorzy są używane do łączenia dwóch lub więcej filtrów, ale działają na różne sposoby. Gdy dwa filtry są oddzielone przecinkiem, oba są stosowane, osobno, na podanych danych i pozwól nam uzyskać dwa różne wyniki. Zobaczmy przykład:

$ jq '.Znaki [0], .postacie [2] „znaki.JSON

Dane formatowane przez JSON zawarte w znakach.plik JSON jest najpierw filtrowany za pomocą .Znaki [0] A potem z .Charaters [2], Aby uzyskać pierwszy i trzeci element tablicy „postaci”. Wykonując powyższe polecenie, uzyskujemy dwa oddzielny wyniki:

„Nazwa”: „Aragorn”, „Race”: „Man” „Nazwa”: „LEGOLAS”, „RACE”: „ELF”
Kopiuj

„|” Operator działa inaczej, w sposób podobny do rury Unix. Wyjście wytworzone przez filtr po lewej stronie operatora jest przekazywane jako wejście do filtra po prawej stronie operatora. Jeśli filtr po lewej stronie operatora wytworzy wiele wyników, do każdego z nich nakłada się filtr po prawej stronie operatora:

$ jq '.Postacie [] | .Znaki nazwy.JSON

W tym przykładzie mamy dwa filtry. Po lewej stronie operatora mamy .postacie[] filtr, który, jak wcześniej widzieliśmy, uzyskajmy elementy tablicy „znaków” jako osobne wyniki. W naszym przypadku każdy wynik jest obiektem z "nazwa" I "wyścig" nieruchomości. .nazwa filtr po prawej stronie | Operator jest stosowany do każdego z obiektów, więc uzyskujemy następujący wynik:

„Aragorn” „Gimli” „Legolas”
Kopiuj

Funkcje

Narzędzie JQ zawiera niektóre bardzo przydatne funkcje, które możemy zastosować do danych sformatowanych JSON. Teraz zobaczymy niektóre z nich: długość, Klucze, ma I mapa.



Funkcja długości

Pierwszym, o którym porozmawiamy, jest długość, który, jak sama nazwa wskazuje, odzyskajmy długość obiektów, tablic i strun. Długość obiektów to liczba ich par kluczowych; Długość tablic jest reprezentowana przez liczbę zawartych elementów; Długość łańcucha to liczba znaków, z których składa się. Zobaczmy, jak korzystać z funkcji. Załóżmy, że chcemy poznać długość tablicy „postaci”, biegamy:

$ jq '.Postacie | Postacie długości.JSON

Zgodnie z oczekiwaniami otrzymujemy 3 W rezultacie, ponieważ jest to liczba elementów w tablicy. W ten sam sposób, aby uzyskać długość pierwszego obiektu w tablicy, którą moglibyśmy uruchomić:

$ jq '.Znaki [0] | Postacie długości.JSON

Tym razem otrzymujemy 2 W rezultacie, ponieważ jest to liczba par zawartych w obiekcie. Jak już powiedzieliśmy, ta sama funkcja zastosowana do łańcucha zwraca liczbę zawartych w niej znaków, więc na przykład uruchomienie:

$ jq '.Znaki [0].Nazwa | Postacie długości.JSON

Otrzymujemy 7 W rezultacie, czyli długość ciągów „Aragorn”.

Funkcja kluczy

Klucze Funkcję można zastosować na obiektach lub tablicach. W pierwszym przypadku zwraca tablicę zawierającą
Klucze obiektów:

$ jq '.Znaki [0] | Postacie kluczy.JSON [„Nazwa”, „Race”]
Kopiuj

Po zastosowaniu do tablicy zwraca inną tablicę zawierającą wskaźniki pierwszego:

$ jq '.Postacie | Postacie kluczy.JSON [0, 1, 2] 
Kopiuj

Klucze funkcja zwraca posortowane elementy: jeśli chcemy, aby elementy zostały zwrócone w kolejności wstawiania, możemy użyć Keys_unsorted Funkcja zamiast tego.

Sprawdzanie, czy obiekt ma klucz

Jedną z bardzo powszechnych operacji, którą możemy chcieć wykonać na obiekcie, jest sprawdzenie, czy zawiera on określony klucz. Aby wykonać to zadanie, możemy użyć ma funkcjonować. Na przykład, aby sprawdzić, czy główny obiekt naszych danych formatowanych JSON zawiera klucz „Broń”, możemy uruchomić:

$ JQ 'ma („broń”) „postacie.JSON FAŁSZ
Kopiuj

W takim przypadku, zgodnie z oczekiwaniami, funkcja zwróciła FAŁSZ Ponieważ obiekt zawiera tylko klucz „znaków”:

$ JQ 'ma („postacie”) „postacie.JSON True
Kopiuj

Po zastosowaniu do tablic funkcja zwraca true, jeśli tablica ma element w danym indeksie lub Fałsz w przeciwnym razie:

$ jq '.Postacie | ma (3) postacie.JSON FAŁSZ
Kopiuj

Tablica „postaci” ma tylko 3 elementy; tablice są zerowe, więc sprawdzaj, czy tablica jako element powiązany z indeksem 3 zwroty FAŁSZ.

Funkcja mapy

Funkcja mapy pozwól nam zastosować filtr do każdego elementu danej tablicy. Na przykład, powiedzmy, że chcemy sprawdzić istnienie klucza „Nazwa” w każdym z obiektów zawartych w tablicy „znaków”. Możemy połączyć mapa I ma funkcje w ten sposób:

$ jq '.Postacie | Mapa (ma („name”)) znaki.JSON [prawda, prawda, prawda] 
Kopiuj

Wnioski

W tym artykule ledwo zarysowujemy powierzchnię funkcji oferowanych przez JQ narzędzie, które pozwala nam analizować i manipulować danymi formatowanymi przez JSON z wiersza poleceń. Nauczyliśmy się podstawowego użycia programu, jak „” i „|” Operatorzy pracują i jak korzystać z długości, klawisze, ma funkcje i mapy, aby odpowiednio uzyskać długości tablic, ciągów i obiektów, uzyskać klucze obiektowe lub indeksy tablicy, sprawdź, czy klucz istnieje w obiekcie lub czy tablica ma element w danym indeksie i zastosuj filtr lub funkcję do każdego elementu tablicy. Odkryć wszystko JQ Mogę zrobić, iść i spójrz na instrukcję programu!

Powiązane samouczki Linux:

  • Jak pracować z WooCommerce Rest API z Pythonem
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do pętli JavaScript
  • Jak śledzić połączenia systemowe wykonane przez proces z Strace na…
  • Mastering Bash Script Loops
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Big Data Manipulacja dla zabawy i zysku Część 1
  • Zagnieżdżone pętle w skryptach Bash
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Jak użyć skryptu Bash, aby uruchomić skrypty Python