Jak używać polecenia jq do przetwarzania JSON w systemie Linux

Jak używać polecenia jq do przetwarzania JSON w systemie Linux
Zdjęcie monitora wyświetlającego plik JSON.

Jq to potężny i bardzo elastyczny program do analizowania składni, który może przesyłać strumieniowo i filtrować dane JSON z plików i potoków UNIX. W tym artykule nauczysz się podstaw jq, przedstawisz przykłady kodu, a także kilka alternatywnych implementacji, które możesz zainstalować już dziś.

Do czego służy jq?

Najpopularniejszym zastosowaniem jq jest przetwarzanie i manipulowanie odpowiedziami JSON z interfejsów API oprogramowania jako usługi (SaaS). Na przykład możesz użyć jq wraz z cURL, aby połączyć się z punktami końcowymi API Digitalocean i uzyskać dane swojego konta.

Terminal pokazujący przykładowy dostęp API dla Digitalocean do jq.

Poza tym jq jest także potężnym narzędziem do zarządzania dużymi plikami JSON. Niektóre z najpopularniejszych obecnie programów baz danych, takie jak MongoDB, PostgreSQL i MySQL, obsługują JSON jako sposób przechowywania danych. W związku z tym nauka jq daje przewagę w zrozumieniu, jak działają te systemy baz danych.

Instalowanie i używanie jq

Aby zacząć od jq, zainstaluj jego pakiet binarny w swoim systemie:

Znajdź otwarty punkt końcowy API, na którym możesz przetestować jq. W moim przypadku użyję interfejsu API sprawdzania adresów IP ipinfo.io.

Skorzystaj z witryny internetowej Jq Json Linux 02 Ipinfo Saas

Najbardziej podstawowym filtrem dla jq jest filtr kropkowy (.). Spowoduje to wydrukowanie odpowiedzi JSON, ponieważ jq otrzymał ją ze standardowego wejścia:

Kolejnym podstawowym filtrem jest symbol potoku (|). Jest to specjalny filtr, który przekazuje wyjście jednego filtra jako wejście innego:

Wartość po operatorze potoku to „Indeks identyfikatora obiektu”. Spowoduje to przeszukanie danych wejściowych JSON pod kątem dowolnej zmiennej pasującej do jej tekstu i wyświetlenie jej wartości na terminalu. W tym przypadku szukam wartości klucza „ip:”.

Terminal pokazujący przefiltrowane wyjście API ipinfo SaaS poprzez jq.

Po opanowaniu i odkurzeniu podstaw, poniższe sekcje pokażą Ci niektóre sztuczki, które możesz wykonać za pomocą jq.

1. Tworzenie podstawowego czytnika kanałów za pomocą jq

Większość nowoczesnych witryn internetowych oferuje obecnie otwarte punkty końcowe API do odczytu danych na swoich platformach. Na przykład każde repozytorium Github ma swój własny adres URL API, za pomocą którego możesz pobrać najnowsze zatwierdzenia i problemy dla tego projektu.

Terminal pokazujący ustawienia domyślne

Możesz użyć takiego punktu końcowego API z jq, aby utworzyć własny prosty kanał przypominający RSS. Na początek użyj cURL, aby sprawdzić, czy punkt końcowy działa poprawnie:

Uruchom następujące polecenie, aby wydrukować pierwszy wpis w swoim kanale:

To pokaże różne pola, które API Github wysyła do jq. Możesz ich użyć do stworzenia własnego, niestandardowego obiektu JSON, przesyłając dane wejściowe do {}filtra nawiasów klamrowych ( ):

Dodanie filtra przecinka (,) wewnątrz nawiasów klamrowych umożliwia dodanie wielu pól do obiektu niestandardowego:

Terminal pokazujący niestandardowy pozbawiony obiektu JSON z interfejsu API Github.

Usunięcie „0” w nawiasach kwadratowych spowoduje zastosowanie filtra jq do całego pliku danych:

Możesz także utworzyć mały skrypt Bash, aby wyświetlić najnowsze wydania swojego ulubionego projektu Github. Wklej następujący blok kodu do pustego pliku skryptu powłoki:

Zapisz plik, a następnie uruchom następujące polecenie, aby uczynić go wykonywalnym:

Przetestuj swój nowy czytnik kanałów, umieszczając najnowsze wydanie w swoim ulubionym repozytorium Github:

Terminal pokazujący działanie niestandardowego skryptu i drukowanie najnowszego wydania Githuba.

2. Czytanie i przeszukiwanie bazy danych JSON

Oprócz odczytywania danych z interfejsów API, możesz także używać jq do zarządzania plikami JSON na komputerze lokalnym. Zacznij od utworzenia prostego pliku bazy danych JSON przy użyciu ulubionego edytora tekstu:

Wklej następujący blok danych do swojego pliku, a następnie zapisz go:

Sprawdź, czy jq poprawnie odczytuje plik JSON, drukując pierwszy obiekt w tablicy bazy danych:

Terminal pokazujący, że jq drukuje pierwszy wpis w bazie danych JSON.

Wykonaj zapytanie do swojej bazy danych JSON za pomocą filtra „Object Identifier-Index”. W moim przypadku szukam wartości klucza „.name” przy każdym wpisie w mojej bazie danych:

Możesz także użyć niektórych wbudowanych funkcji jq do filtrowania zapytań na podstawie określonych cech. Na przykład możesz wyszukać i wydrukować wszystkie obiekty JSON, które mają wartość „.name” zawierającą więcej niż sześć znaków:

Terminal pokazujący wyjście jq z ograniczeniem długości nazwy.

Praca na bazach danych JSON za pomocą jq

Oprócz tego jq może działać na bazach danych JSON podobnie jak podstawowy arkusz kalkulacyjny. Na przykład poniższe polecenie wypisuje sumę klucza „.balance” dla każdego obiektu w bazie danych:

Możesz nawet rozszerzyć to, dodając do zapytania instrukcję warunkową. Poniższe polecenie doda „.balance” tylko wtedy, gdy wartość „.name” drugiego obiektu to „Alice”:

Terminal pokazujący instrukcję warunkową w jq uruchomioną w bazie danych.

Możliwe jest tymczasowe usunięcie zmiennych z bazy danych JSON. Może to być przydatne, jeśli testujesz filtr i chcesz się upewnić, że może on nadal przetwarzać Twój zbiór danych:

Terminal pokazujący drugi wpis bez klucza JSON o nazwie.

Nowe zmienne możesz także dodawać do swojej bazy danych za pomocą operatora „+”. Na przykład poniższa linia dodaje zmienną „active: true” do pierwszego obiektu w bazie danych:

Terminal pokazujący dodatkową wartość klucza w pierwszym wpisie w bazie danych.

3. Przekształcanie danych innych niż JSON w jq

Kolejną znakomitą cechą jq jest to, że może akceptować i pracować z danymi innymi niż JSON. Aby to osiągnąć, program wykorzystuje alternatywny „tryb slurp”, w którym konwertuje dowolne dane rozdzielane spacjami i znakami nowej linii na tablicę JSON.

Możesz włączyć tę funkcję, przesyłając dane do jq z -sflagą:

Terminal pokazujący ciąg tekstowy przekonwertowany na tablicę JSON.

Jedną z zalet konwersji surowych danych na tablicę jest to, że można je adresować za pomocą numerów indeksów tablicy. Poniższe polecenie dodaje dwie wartości, odwołując się do ich przekonwertowanej lokalizacji w tablicy:

Możesz posunąć tę lokalizację tablicy dalej i zbudować wokół niej nowy kod JSON. Na przykład ten kod konwertuje tekst z polecenia echo na obiekt JSON poprzez filtr nawiasów klamrowych:

Terminal pokazujący niestandardowy obiekt JSON w formacie przykładowej bazy danych.

Oprócz pobierania surowych danych, jq może również zwracać jako dane wyjściowe dane inne niż JSON. Jest to przydatne, jeśli używasz jq jako części większego skryptu powłoki i potrzebujesz tylko wyniku z jego filtrów.

Aby to zrobić, uruchom jq, a następnie -rflagę. Na przykład poniższe polecenie odczytuje wszystkie nazwy z mojego pliku bazy danych i zwraca je w postaci zwykłego tekstu:

Terminal pokazujący listę nazwisk z bazy danych z usuniętym formatowaniem.

Alternatywne parsery JSON do jq

Ponieważ kod jq jest kodem open source, różni programiści stworzyli własne wersje parsera JSON. Każdy z nich ma swój własny, unikalny punkt sprzedaży, który albo ulepsza, albo zmienia podstawową część jq.

1 like

Jaq to potężny parser JSON, który zapewnia niemal identyczny zestaw funkcji jak jq.

Napisany w języku Rust, jedną z największych zalet Jaq jest to, że może obsługiwać język jq do 30 razy szybciej niż oryginalny parser, zachowując jednocześnie kompatybilność wsteczną. Samo to czyni go cennym, gdy używasz dużych filtrów jq i chcesz zmaksymalizować wydajność swojego komputera.

Terminal pokazujący działanie Jaq w mojej przykładowej bazie danych.

To powiedziawszy, jedną wadą jaq jest to, że nie jest on obecnie dostępny w repozytoriach Debiana, Ubuntu i Fedory. Jedynym sposobem na jego uzyskanie jest pobranie Homebrew lub skompilowanie go ze źródła.

2. Idź

Gojq to alternatywny parser JSON napisany w całości w Go. Zapewnia przystępną i łatwą w użyciu wersję jq, którą można zainstalować na prawie każdej platformie.

Oryginalny program jq może być niezwykle zwięzły w komunikatach o błędach. W rezultacie debugowanie skryptów jq jest szczególnie trudne dla nowego użytkownika jq. Gojq rozwiązuje ten problem, pokazując, gdzie w skrypcie znajduje się błąd, a także dostarczając szczegółowe komunikaty na temat rodzaju błędu, który się pojawił.

Terminal pokazujący przykładową bazę danych odczytaną dla gojq.

Kolejną zaletą gojq jest to, że może czytać i przetwarzać zarówno pliki JSON, jak i YAML. Może to być szczególnie przydatne, jeśli jesteś użytkownikiem Dockera i Docker Compose i chcesz zautomatyzować przepływ pracy podczas wdrażania.

Największym problemem Gojq jest to, że usunął niektóre funkcje, które są domyślnie dostępne w oryginalnym parserze jq. Na przykład opcje takie jak --ascii-output, --seqi --sort-keysnie istnieją w gojq.

3. fq

W przeciwieństwie do jaq i gojq, fq to kompleksowy zestaw narzędzi programowych, który może analizować zarówno dane tekstowe, jak i binarne. Może współpracować z wieloma popularnymi formatami, takimi jak JSON, YAML, HTML, a nawet FLAC.

Terminal pokazujący fq czytający przykładowy plik bazy danych.

Największą cechą fq jest to, że zawiera wbudowany czytnik szesnastkowy plików. To sprawia, że ​​sprawdzanie wewnętrznej struktury pliku w celu ustalenia, w jaki sposób jest on utworzony i czy jest w nim coś złego, staje się trywialne. Poza tym fq używa tej samej składni dla jq podczas pracy z tekstem, co ułatwia naukę każdemu, kto już zna jq.

Minusem tego ambitnego celu jest to, że fq jest wciąż w fazie intensywnego rozwoju. W związku z tym niektóre funkcje i zachowania programu nadal podlegają radykalnym zmianom.

Odkrywanie jq, jak to działa i co czyni go wyjątkowym, to tylko pierwszy krok w nauce tworzenia programów na komputerze. Zanurz się głęboko w cudowny świat kodowania, czytając podstawy programowania w powłoce.

Źródło zdjęcia: Ferenc Almasi za pośrednictwem Unsplash . Wszystkie zmiany i zrzuty ekranu wykonał Ramces Red.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *