Jak używać polecenia jq do przetwarzania JSON w systemie Linux
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.
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.
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:”.
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.
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:
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:
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:
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:
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”:
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:
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:
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 -s
flagą:
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:
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 -r
flagę. Na przykład poniższe polecenie odczytuje wszystkie nazwy z mojego pliku bazy danych i zwraca je w postaci zwykłego tekstu:
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.
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ł.
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
, --seq
i --sort-keys
nie 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.
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