Menu
About me Kontakt

In his latest video, Jakub Mrugalski introduces viewers to effective methods of working with JSON files using the JQ tool in the terminal. He begins by emphasizing the need for an appropriate JSON file and the installation of JQ, noting that the installation process varies between operating systems. Step by step, he shows various methods of invoking JQ, including using basic selectors and combinations with other commands to easily retrieve data from JSON.

Jakub then demonstrates how to use different selectors to extract specific information, such as the store's name and address. He underscores the importance of navigating through nested JSON structures and explains clearly how to access the data of interest. Throughout the demonstration, Jakub encourages experimentation with different methods to fully grasp the potential of JQ.

The next part of the video delves into more advanced operations, such as sorting data and extracting specific information from multi-layered arrays. Jakub highlights that controlling syntax and the correct selection of brackets are crucial when working with JQ. He also shows how to generate CSV or HTML files from JSON data, a useful aspect for users working with large datasets.

In the further section of the video, Jakub discusses filtering functions like 'select' for extracting data that meets certain criteria. Mentions of filtering books by price demonstrate the versatility of JQ's applications, while also highlighting the vast possibilities users can find in customizing filters according to their needs. With clear examples, viewers have a chance to understand how JQ allows interaction with data.

Finally, Jakub encourages viewers to check out his e-book containing 77 tasks related to server administration, which can aid in developing skills in this area. Noticing that at the time of writing this article, the video has 9120 views and 429 likes, he concludes with thoughts about the value of learning through tasks and collaboration in suitable groups.

Toggle timeline summary

  • 00:00 Introduction to working with JSON files using JQ in the terminal.
  • 00:08 Creating a JSON file named 'ksiazkI JSON' for demonstration.
  • 00:13 Explaining the initial format issues such as encoding and nesting.
  • 00:20 Overview of the data structure including store name, physical address, and categories.
  • 00:34 Installing JQ is necessary, with different methods for various systems.
  • 00:39 First method to load a file using JQ, noting the removal of encoding issues.
  • 00:51 The second method involves using a selector inside JQ commands.
  • 01:04 Highlighting common mistakes made by beginners when using JQ.
  • 01:40 Using a basic selector to print all JSON data.
  • 02:00 Extracting specific fields like 'nazwa' and 'adres' from the JSON.
  • 02:25 Understanding the deeper structure of the data to access book titles.
  • 02:50 Demonstrating how to access nested arrays within the JSON structure.
  • 04:09 Attempting to sort the book titles alphabetically.
  • 04:47 Extracting the list of categories from the JSON structure.
  • 05:50 Filtering books within specific categories based on price.
  • 06:59 Extracting and displaying specific development books.
  • 09:11 Creating a new JSON without unnecessary fields.
  • 09:25 Calculating the total price of all books in a specified category.
  • 10:05 Counting the number of specific books available.
  • 11:49 Exploring JSON structures using specific keys.
  • 12:18 Showing how to use ranges for accessing multiple entries.
  • 13:19 Conclusion about working with JQ and encouraging further learning.

Transcription

Cześć, nazywam się Kuba Mrugalski i pokażę Ci w tym filmie jak pracować z plikami JSON z użyciem narzędzia JQ, nie marnując czasu, chodzi o terminala. Na początek potrzebujemy jakiś plik, na którym będziemy pracować. Ja stworzyłem plik o nazwie książki JSON. Ten plik ma taki dość dziwny format, to znaczy widać tutaj, niektóre rzeczy się rozwalają z kodowaniem, mamy tu jakieś zagnieżdżenia. Widzimy, że jest tu nazwa sklepu, adres sklepu fizyczny, adres internetowy, jakieś kategorie, dużo danych i chcielibyśmy je jakoś ogarnąć. Na początek oczywiście wypadałoby to JQ zainstalować. Nie będę wychodził przez to jak to zainstalować, na każdym systemie robi się to inaczej. Ale jeżeli już masz to w systemie zainstalowane, to możesz wywołać JQ na co najmniej trzy sposoby. Metoda pierwsza, JQ, znak wczytania pliku i następnie nazwa pliku, który chcesz wczytać. I gotowe. Zwróćmy teraz uwagę, że wszelkiego rodzaju rozwalone kodowanie już nas nie dotyczy. Wszystko zostało zencodowane tak jak trzeba. Mało tego, mamy tu pokolorowaną całą składnię i o wiele, wiele ładniej wygląda to. Dobra, teraz druga metoda to jest użycie tak zwanego selektora, to znaczy damy tutaj selektor kropka. Co ta kropka znaczy? Za chwilę powiem. I dajemy Enter. Wielu początkujących wywódkowników JQ używa składni takiej, to znaczy JQ, nazwa pliku i liczy na to, że faktycznie coś wyprintuje. No wyprintuje oczywiście, ale tylko error. I dlaczego tak się dzieje? Brak selektora, no to po prostu to jest wyrzucenie errora na ekran. Można jeszcze użyć metody z katem. Metoda z katem nie jest zbyt lubiana przez początkujących adminów. Oni zawsze się czepiają, że jest to tak zwane niepotrzebne użycie kata. No dobra, dajemy tutaj JQ, ale przynajmniej nie musimy selektora używać i dajemy Enter. Działa to dokładnie tak samo. No to żeby trochę podenerwować początkujących adminów, zrobimy sobie wersję z katem i będziemy wyciągać kolejne dane. Na początek podstawowy selektor to jest kropka. Kropka to jest po prostu początek drzewa Jsona i to znaczy od początku wyprintuj mi wszystko jak leci. Enter. Jak się domyślasz daje to po prostu całego Jsona ładnie sformatowanego, ale chcielibyśmy wyciągnąć jakieś jedno konkretne pole. Niech to będzie pole nazwa, a potem wyciągniemy jeszcze adres. No to w takim razie zamiast kropki dajemy po prostu kropka i nazwa pola, czyli na przykład nazwa i Enter. No i mamy taniutki ebook wyciągnięty. Gdybyśmy chcieli wyciągnąć dwa pola dajemy przecinek i następnie kropka adres. I teraz dajemy Enter i mamy i nazwę naszego sklepu i adres tego sklepu. Chcielibyśmy teraz wyciągnąć załóżmy wszystkie tytuły książek jakie tylko są w środku. Przyjrzyjmy się jeszcze raz jak wygląda struktura danych. Tu mamy tytuł, tytuł, czyli w zasadzie chcemy wyciągnąć pole tytuł. Wielu początkujących użytkowników JQ wpisałoby tak, no ale to nie jest do końca poprawne. Zwraca nam nula, bo nie ma takiego pola na początku drzewa naszego Jsona jak tytuł. Ono, to pole jest bardzo głęboko zaszyte wewnątrz struktury. Ta struktura dokładnie wygląda. Popatrzmy na to. Główne pole w naszym Jsonie nazywa się kategorie. W środku mamy jakąś tablicę, gdzie są przewodniki, mamy rozwojowe książki, mamy poradniki. No okej, czyli to jest tablica. A co się znajduje wewnątrz tej tablicy? Znajduje się kolejna tablica. Teraz jak tutaj można sobie z tym poradzić? Popatrz na to. Jeżeli wiemy, że to jest wewnątrz takiej gałęzi o nazwie kategorie to podajemy nazwę gałęzi po prostu. Okej, Enter. I widzimy teraz mamy tutaj tylko gałęź kategorię, czyli odcięliśmy tam nazwę, adres URL, adres fizyczny. No dobra. I to są teraz nasze poszczególne wpisy. Chcielibyśmy jednak każdy z tych wpisów potraktować indywidualnie. Jest to tablica, dlatego też dajemy na końcu kwadratowe nawiasy. To znaczy będę traktował kategorię jak tablicę, a nie jak jeden obiekt. Daję Enter. I teraz widzimy, że to się podzieliło nam na takie poszczególne wpisy. Mamy ile tych tablic? No tutaj jest pierwsza tablica, druga tablica i trzecia tablica. Dlaczego tak? Dlatego, że mamy trzy kategorie. No dobra. Chcielibyśmy więc kategorie, które są tablicą potraktować też jako tablica. Nie wiem, czy tutaj załapałeś przeskok, ale chodzi o to, że mamy podwójne zagłębienie tablic i dopiero teraz występuje tutaj pole tytułu. No dobra. Czy to działa? Jak najbardziej działa. No świetnie. Chcielibyśmy teraz te tytuły, załóżmy posortować sobie alfabetycznie. No to dajemy sobie Pypa, po prostu Sort. I okazuje się, że to nie działa. Dlaczego nie działa? Mamy tutaj informację, że coś takiego jak słowo przewodnik nie może być sortowane. Dlaczego? Dlatego, że wrzuciliśmy stringa do wnętrza czegoś, co sortuje tablicę. Co więc trzeba zrobić? Trzeba zamienić nasz wynik na tablicę. Jak to zrobić najprościej? Znowu kwadratowe nawiasy. Zasada jest bardzo prosta. Jeżeli w JQ coś nie działa, to albo dlatego, że masz kwadratowe nawiasy, albo dlatego, że o nich zapomniałeś. Czyli na wszelki wypadek dodaj je. I Enter. I okazuje się, że tak jak najbardziej zostało to posortowane. Od 1, 2, 3, aż do przewodnika po datrach. No spoko. Co jeszcze byśmy mogli tutaj zrobić? Chcielibyśmy na przykład wyciągnąć listę naszych kategorii. Jak to zrobić? Bo jeżeli napiszemy coś takiego kropka kategorie, no to nam wyciągnie faktycznie zawartość naszych kategorii. Ale my byśmy chcieli wyciągnąć to, to coś. Co byśmy tu mogli zrobić? Moglibyśmy na przykład dać sobie tutaj Pipe'a i następnie GIS, czyli klucze. I dajemy Enter i widzimy tutaj, że mamy poradniki, przewodniki rozwojowe. No super. Udało nam się wyciągnąć klucze. A gdyby tak te klucze zapisać załóżmy w formacie CSV? Czemu by nie? Pipe, Małpa, CSV. I gotowe. A może w HTML-u byśmy to sobie zrobili? Nie ma problemu, jest filtr do HTML-a. HTML, proszę bardzo, zapisane. Może nie za ładnie, ale też da się to wypintować. Dobrze, co byśmy mogli jeszcze wyciągnąć? Załóżmy, przeglądnijmy sobie, jak wygląda nasza struktura danych. Wygląda ona w ten sposób. I chcielibyśmy na przykład wyciągnąć załóżmy książki, które są w kategorii rozwojowe i których cena jest załóżmy większa niż 60 zł. Jak to zrobić? No to w takim razie dajemy tutaj kategorię. Znowu literówka. I teraz byśmy chcieli się dobrać do rozwojowe. Jak się domyślasz, kropka rozwojowa. I mamy wszystko gotowe. I teraz chcielibyśmy zrobić co? Chcielibyśmy przesortować to. Tylko za pomocą takiej funkcji jak select. Działa to plus, minus na tej zasadzie jak na przykład w języku SQL. W sumie da się dorzucić tak. Pipe, select, a następnie nazwa pola, czyli kropka cena. I następnie co się ma z tym czymś dziać? Większa od 60. Prawdopodobnie tutaj nam się wysypie ze względu na to, że to nie jest tablica. Enter. Jak najbardziej. To nie jest tablica. No to co robimy? Lecimy po tablicę. Enter. I teraz widzimy, że wyprintowało nam tylko te książki, które mają cenę większą niż 60 zł. Czyli mamy tutaj pokochaj siebie w 7 dni i 123 sposoby na bycie szczęśliwy. No okej. A teraz chcielibyśmy zrobić coś jeszcze innego. Na przykład wszystkie książki rozwojowe chcielibyśmy wyprintować załóżmy jako CSV. Bo takie nam są potrzebne. Czemu by nie? No to co robimy? Wszystkie książki rozwojowe, czyli prawdopodobnie taki będzie selektor. Wyczyścimy ekran, żeby to jakoś ładniej wyglądało. I damy Enter. Są książki. I teraz byśmy chcieli to zamienić sobie na CSV. Czyli małpa CSV. Okej. To nie zadziała. Można byłoby to zamienić oczywiście jako arraja w ten sposób, ale to też nie do końca zadziała. Co trzeba zrobić? Trzeba spłaszczyć tą strukturę do takiego formatu, ażeby mogła być ona zapisana w CSV. W plikach CSV nie ma czegoś takiego jak tytuły pól. Dlatego użyjemy czegoś takiego jak funkcja flatten. Zobacz jak to działa. Enter. Ops. Tak zrobimy. Okej. To zostało spłaszczone. Spłaszczone to znaczy, wszystko jest jednowymiarowe. Mamy tutaj nazwę, wartość, wartość na tej zasadzie. Nie ma po prostu tytułu pola. Czyli na przykład nazwa, cena, inne takie rzeczy. I teraz co możemy z tym zrobić? Faktycznie teraz możemy to zapisać jako na przykład plik CSV. I mamy to całkiem ładnie zrobione. Tylko dlaczego tutaj, cudzysłowie, nam zbackspacowało jakieś inne rzeczy? No trochę nieładnie to wygląda. No można sobie uruchomić JQ w trybie row. Czyli nie dodawaj zbyt lepszego formatowania, nie escape'uj danych. Po prostu jak leci, tak wrzucaj na ekran. Enter. I teraz widać, że ten plik CSV wygląda o wiele lepiej. Co jeszcze byśmy mogli zrobić? Wrócimy sobie do początku drzewa i znowu mamy nasze dość zaawansowane tutaj rzeczy. Chcielibyśmy na przykład znowu kategorie rozwojowe wyprintować, czyli to co było wcześniej, ale chciałbym z tej kategorii usunąć po prostu jedną z wartości. Ten slug tutaj, to jest jakiś fragment urla. On jest mi zupełnie do niczego niepotrzebny. No to w takim razie co robię? Używam funkcji o nazwie del, tak jak delete. A następnie kropka slug. I oczywiście zapomniałem kwadratowe nawiasy, wiadomo o co chodzi. Enter. I okazuje się, że tak utworzyłem sobie nowego JSON-a, który nie posiada tego pola, który dla mnie jest zbyteczny. Dobra, co robimy dalej? Załóżmy, chcielibyśmy ceny wszystkich książek w jakiś sposób zsumować. To co robimy? Z tych naszych książek rozwojowych wyprintujemy sobie cenę. I wygląda to w ten sposób. I teraz trzeba dać to do selektora o nazwie add, dodawanie. Znowu tutaj będziemy mieli problem z arrajem. Wysypało się. To łatwo zapamiętać. Za każdym razem jak się wysypuje prawdopodobnie podałeś coś, co jest stringiem, liczbą albo czymkolwiek innym, a powinno być arrajem. No to robimy sobie z tego arraj i wygląda trochę lepiej. Nasze książki kosztują 499 zł w tej kategorii. To jest suma tych trzech liczb. No dobra. A ile my tych książek w ogóle mamy? To jest dobre pytanie, nie? No to co robimy? Wyciągamy książki rozwojowe, załóżmy. OK. I tutaj selektora zgubiłem oczywiście. I teraz pytanie, ile tego jest? Pipe length 33333. Dlaczego w ten sposób? No, znowu zapomnieliśmy czegoś takiego jak nawiasy kwadratowe. I teraz jest lepiej trzy sztuki. Więc mamy tutaj selektory. Łatwo te selektory sobie wymyślić nawet, jeżeli czegoś nie znasz. Pokazałem Ci np. att do dodawania zmiennych. No to jest zapewne funkcja też sub do tego, aby coś odejmować. Mamy tutaj length do sprawdzenia długości. Skoro mamy del do usuwania, to kolejne funkcje można sobie też wymyślić na podstawie tego, że to są nazwy dość naturalne. No dobra. A teraz byśmy chcieli zrobić coś nieco bardziej skomplikowanego. Np. znowu wyprintuję sobie strukturę, jak ona wygląda. Czyli dajemy kropka. I teraz co widzimy? Mamy tutaj sluga, czyli fragment urla. I mamy tutaj podstawowy adres URL. To coś. Teraz chcemy tego sluga dokleić na końcu. Jak to zrobić? Da się to łatwo zrobić, czyli tak. Na początku wyciągamy urla. OK. I teraz mamy coś takiego. Następnie wyciągamy sobie np. kropka kategorie. Kategorie, załóżmy, rozwojowe niech będzie. Rozwojowe. I to jest oczywiście araj. I wyciągamy sobie z tego sluga. Jaki będzie efekt? Dość dziwny. Takie coś. Dlaczego? Bo na początku wyjęło urla, a potem wyjęło wszystkie możliwe slugi. Chcielibyśmy to skleić w jakiś sposób, więc no prościej się nie da. Po prostu sklejasz to. Pusty string. Damy sobie tak, żeby ładnie wyglądało. I teraz jaki będzie efekt? No efekt jest dokładnie taki, jaki chcieliśmy, czyli wszystko działa po naszej myśli. No dobra. Mamy to ogarnięte. Co byśmy jeszcze mogli zrobić? Moglibyśmy np. odwoływać się do książek, załóżmy, z kategorii rozwojowych, ale na podstawie ich numerów. Czyli damy sobie coś takiego. Mamy tutaj tylko trzy sztuki. Pierwszy, drugi, trzeci. Chcielibyśmy książkę numer 1. Pamiętaj, że wszystkie araje numerowane są od zera, więc jeżeli dasz sobie tutaj coś takiego jak 0, to wyciągniesz pierwszą z książek. I teraz co robimy dalej? Gdybyśmy chcieli np. pierwszą oraz drugą, to w ten sposób. I teraz mamy dwie książki. A do tego dorzucimy trzecią? Nie ma problemu, damy sobie trzecią. Trzecią w sensie taka numeracja. I teraz co widzimy? Możliwe dane z naszego JSON-a, ale chcielibyśmy nie wymieniać tysiąca rekordów 1, 2, 3, 4, 5 do tysiąca, tylko zakresowo. Zakres możemy podać np. w ten oto sposób, tylko tutaj jest małe zaskoczenie. Popatrz na ten wynik. Dlaczego wyprintowało tylko jedno? Dlatego, że to jest nie włącznie, tylko to jest do. Jeżeli chcesz, załóżmy, od zera do jeden wyprintować, to musisz dać tutaj dwa. To dwa nie będzie po prostu zaliczone do zwracanych wartości. Jeżeli chcemy wszystkie, to w takim razie do trzy. No i w ten sposób sobie to działa. Te filtry można oczywiście łączyć, tzn. możemy tutaj sobie zrobić selecta i np. po cenie sortować. Gdybyś chciał sortować po wielu polach, to jest tak samo obsługa takich przełączników jak or, and, więc to jak najbardziej powinno wszystko działać. No dobra, to jest w zasadzie wszystko, co powinieneś wiedzieć odnośnie pracy z JQ i to powinno Ci na start wystarczyć. Gdy przeglądniesz dokumentację do JQ, to zrozumiesz, że tych funkcji jest znacznie, znacznie więcej, tych filtrów jest jeszcze więcej i możesz je po prostu ze sobą połączyć tak, aby otrzymać taki wynik, jaki jest Ci potrzebny. Jeżeli interesuje Cię rozwój w takiej kategorii jak właśnie administracja serwerami, to przygotowałem e-booka, którego możesz pobrać płacąc swoim adresem mailowym i link do niego masz w opisie do tego filmu. Jest to 77 zadań z kategorii takich jak administracja Angelnexem albo Apachem, trochę na temat Ansibla, trochę na temat Dockera. Nie ma tam rozwiązania, są tam tylko zadania i ewentualne podpowiedzi do tego, w jaki sposób te zadania rozwiązać. Dzięki rozwiązywaniu takich zadań Twoja wiedza prawdopodobnie wzrośnie. A jeżeli miałeś problem z którymś zadaniem, to nie pisz do mnie bezpośrednio, tylko zrób to w taki sposób, aby też innym dać korzyść, to znaczy zapraszam na grupę facebookową o nazwie Mikrusy. Tam są ludzie, którzy korzystają z mojego projektu mikr.us i tam też ludzie pomagają sobie nawzajem. I z pewnością ktoś pomoże Ci właśnie w rozwiązaniu któregoś z tych zadań. Tyle na dzisiaj. Do zobaczenia w kolejnym filmie. Cześć. Napisy stworzone przez społeczność Amara.org