Próbuję przeanalizować JSON zwrócony z żądania curl, tak:
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
Powyższe dzieli JSON na pola, na przykład:
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
Jak wydrukować określone pole (oznaczone przez -v k=text
)?
grep -Po '"'"version"'"\s*:\s*"\K([^"]*)' package.json
. To rozwiązuje zadanie łatwo i tylko z grep i działa idealnie dla prostych JSONów. W przypadku złożonych JSON-ów powinieneś użyć odpowiedniego parsera.Odpowiedzi:
Istnieje wiele narzędzi zaprojektowanych specjalnie do manipulowania JSON z poziomu wiersza poleceń i będzie o wiele łatwiejsze i bardziej niezawodne niż robienie tego z Awk, takie jak
jq
:Można to również zrobić za pomocą narzędzi, które prawdopodobnie są już zainstalowane w systemie, takich jak Python korzystający z
json
modułu , dzięki czemu można uniknąć dodatkowych zależności, a jednocześnie korzystać z właściwego parsera JSON. Poniżej założono, że chcesz użyć UTF-8, w którym powinien być zakodowany oryginalny JSON i jest to również to, czego używają najbardziej nowoczesne terminale:Python 3:
Python 2:
Notatki historyczne
Ta odpowiedź początkowo zalecała jsawk , który powinien nadal działać, ale jest nieco bardziej kłopotliwy w użyciu niż
jq
i zależy od zainstalowanego samodzielnego interpretera JavaScript, który jest mniej powszechny niż interpreter Pythona, więc powyższe odpowiedzi są prawdopodobnie preferowane:Ta odpowiedź również pierwotnie używała interfejsu API Twittera z pytania, ale ten interfejs API już nie działa, co utrudnia skopiowanie przykładów do przetestowania, a nowy interfejs API Twittera wymaga kluczy API, więc przełączyłem się na używanie interfejsu API GitHub, który może być łatwo używany bez kluczy API. Pierwsza odpowiedź na pierwotne pytanie brzmiałaby:
źródło
print
instrukcja zawsze będzie kodować do ASCII, ponieważ używasz Pythona w potoku. WstawPYTHONIOENCODING=<desired codec>
do polecenia, aby ustawić inne kodowanie wyjściowe, odpowiednie dla twojego terminala. W Pythonie 3 wartością domyślną jest UTF-8 w tym przypadku (przy użyciuprint()
funkcji ).curl -s
jest równoważnecurl --silent
, podczas gdyjq -r
znaczy tojq --raw-output
znaczy bez cudzysłowów łańcuchowych.Aby szybko wyodrębnić wartości dla konkretnego klucza, osobiście lubię używać „grep -o”, który zwraca tylko dopasowanie wyrażenia regularnego. Na przykład, aby uzyskać pole „tekstowe” z tweetów, coś takiego:
Ten wyrażenie regularne jest bardziej niezawodne, niż mogłoby się wydawać; na przykład dobrze radzi sobie z ciągami znaków z osadzonymi przecinkami i znakami cudzysłowu. Myślę, że przy odrobinie pracy można stworzyć taki, który w rzeczywistości gwarantuje wydobycie wartości, jeśli jest ona atomowa. (Jeśli ma zagnieżdżenie, wyrażenie regularne nie może tego oczywiście zrobić).
I do dalszego czysty (choć zachowując oryginalny ucieczce struny) można użyć coś takiego:
| perl -pe 's/"text"://; s/^"//; s/",$//'
. (Zrobiłem to dla tej analizy .)Wszystkim hejterom, którzy nalegają, powinieneś użyć prawdziwego parsera JSON - tak, jest to niezbędne dla poprawności, ale
grep -o
jest o rząd wielkości szybszy niż standardowajson
biblioteka Pythona , przynajmniej w przypadku tweetów ( o wielkości ~ 2 KB każda). Nie jestem pewien, czyjson
dzieje się tak tylko dlatego, że jest powolny (powinienem kiedyś porównać do yajla); ale w zasadzie wyrażenie regularne powinno być szybsze, ponieważ jest w stanie skończonym i jest o wiele bardziej możliwe do zoptymalizowania, zamiast parsera, który musi obsługiwać rekurencję, iw tym przypadku spędza wiele drzew budujących procesor dla struktur, na których ci nie zależy. (Gdyby ktoś napisał skończony przetwornik stanu, który poprawnie parsował JSON (z ograniczoną głębokością), byłoby fantastycznie! W międzyczasie mamy „grep -o”.)Aby pisać możliwy do utrzymania kod, zawsze używam prawdziwej biblioteki parsującej. Nie próbowałem jsawk , ale jeśli działa dobrze, to adresowałby punkt 1.
Ostatnie, zwięzłe rozwiązanie: napisałem skrypt, który używa Pythona
json
i wyodrębnia klucze, które chcesz, do kolumn oddzielonych tabulatorami; następnie przepuszczam rurkę przez opakowanie,awk
które umożliwia nazwany dostęp do kolumn. Tutaj: skrypty json2tsv i tsvawk . W tym przykładzie byłoby to:Podejście to nie odnosi się do nr 2, jest bardziej nieefektywne niż pojedynczy skrypt Pythona i jest trochę kruche: wymusza normalizację znaków nowej linii i tabulatorów w wartościach ciągów, aby dobrze się bawić z widokiem świata ograniczonym polem / rekordem awk. Ale pozwala ci pozostać w wierszu poleceń, z większą poprawnością niż
grep -o
.źródło
grep -Po '"text":(\d*?,|.*?[^\\]",)'
jq .name
działa w wierszu poleceń i nie wymaga „otwierania edytora, aby napisać skrypt”. 2. Nie ma znaczenia, jak szybko wyrażenie regularne może dawać błędne wyniki| grep -Po '"text":.*?[^\\]",'|awk -F':' '{print $2}'
-P
opcji brakuje. Testowałem na OSX 10.11.5 i takgrep --version
byłogrep (BSD grep) 2.5.1-FreeBSD
. Mam to działa z opcją „Extended regex” w OSX. Polecenie z góry byłobygrep -Eo '"text":.*?[^\\]",' tweets.json
.Na podstawie tego, że niektóre z rekomendacji (szczególnie w komentarzach) sugerowały użycie Pythona, byłem rozczarowany, że nie znalazłem przykładu.
Oto jeden linijka, aby uzyskać jedną wartość z niektórych danych JSON. Zakłada się, że przesyłasz dane skądś (skądś) i dlatego powinno być przydatne w kontekście skryptów.
źródło
pythonpy
( github.com/russell91/pythonpy jest prawie zawsze lepszą alternatywą dlapython -c
, chociaż trzeba go zainstalować za pomocą pip. po prostupy --ji -x 'x[0]["hostname"]'
potokuj json . Jeśli nie chcesz używać wbudowanej obsługi json_input, nadal możesz uzyskać te są importowane automatycznie jakopy 'json.loads(sys.stdin)[0]["hostname"]'
jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); print($1)"; }
aby móc pisać:curl ...... | jsonq 'json.dumps([key["token"] for key in obj], indent=2)'
i więcej podobnych przerażających rzeczy ... Btw,obj[0]
wydaje się niepotrzebne, wygląda na to, żeobj
działa po prostu w domyślnych przypadkach (?).jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); sys.stdout.write(json.dumps($1))"; }
obj[0]
powoduje błąd podczas analizowania{ "port":5555 }
. Działa dobrze po usunięciu[0]
.Podążając za MartinR i Boecko:
To da ci wyjątkowo przyjazny efekt grep. Bardzo wygodne:
źródło
| grep field
. Dzięki!jq
nie jest zwykle instalowany, gdy Python jest. Ponadto, gdy jesteś już w Pythonie, możesz równie dobrze przejść całą drogę iimport json...
Możesz po prostu pobrać plik
jq
binarny na swoją platformę i uruchomić (chmod +x jq
):Wyodrębnia
"name"
atrybut z obiektu json.jq
strona główna mówi, że jest tak jak wsed
przypadku danych JSON.źródło
jq
jest niesamowitym narzędziem.curl -s https://api.example.com/jobs | jq '.jobs[] | {id, o: .owner.username, dateCreated, s: .status.state}'
Korzystanie z Node.js
Jeśli system ma węzełPo zainstalowaniu można użyć flagi
-p
drukowania i-e
ewaluacji skryptów,JSON.parse
aby wyciągnąć dowolną potrzebną wartość.Prosty przykład z wykorzystaniem ciągu JSON
{ "foo": "bar" }
i wyciągnięcia wartości „foo”:Ponieważ mamy dostęp
cat
i inne narzędzia, możemy użyć tego do plików:Lub dowolny inny format, taki jak adres URL zawierający JSON:
źródło
node -p -e 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
curl -s https://api.github.com/users/trevorsenior | node -pe "JSON.parse(require('fs').readFileSync('/dev/stdin').toString()).name"
cat package.json | node -pe 'JSON.parse(fs.readFileSync(0)).version'
Użyj obsługi JSON w Pythonie zamiast awk!
Coś takiego:
źródło
json.load(sys.stdin)['"key']"
jako przykład takich jak:curl -sL httpbin.org/ip | python -c "import json,sys; print json.load(sys.stdin)['origin']"
.Zapytałeś, jak strzelić sobie w stopę, a ja jestem tutaj, aby dostarczyć amunicję:
Możesz użyć
tr -d '{}'
zamiastsed
. Ale ich całkowite pominięcie wydaje się mieć również pożądany efekt.Jeśli chcesz usunąć zewnętrzne cytaty, przeprowadź wynik powyższego
sed 's/\(^"\|"$\)//g'
Myślę, że inni wydali wystarczający alarm. Będę stał przy telefonie komórkowym, żeby wezwać pogotowie. Strzelaj, gdy będziesz gotowy.
źródło
Używanie Bash z Pythonem
Utwórz funkcję bash w pliku .bash_rc
Następnie
Oto ta sama funkcja, ale z kontrolą błędów.
Gdzie $ # -ne 1 zapewnia co najmniej 1 wejście, a -t 0 upewnia się, że przekierowujesz z potoku.
Zaletą tej implementacji jest to, że możesz uzyskać dostęp do zagnieżdżonych wartości json i otrzymać je w zamian! =)
Przykład:
Jeśli chcesz być naprawdę fantazyjny, możesz wydrukować dane:
źródło
curl http://foo | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["environment"][0]["name"]'
sys.stdout.write()
jeśli chcesz, aby działał zarówno z Pythonem 2, jak i 3.getJsonVal() { py -x "json.dumps(json.loads(x)$1, sort_keys=True, indent=4)"; }
TickTick to parser JSON napisany bash (<250 linii kodu)
Oto fragment autora z jego artykułu Wyobraź sobie świat, w którym Bash wspiera JSON :
źródło
Przetwarzanie JSON z PHP CLI
Prawdopodobnie nie na temat, ale skoro panuje pierwszeństwo, to pytanie pozostaje niepełne bez wzmianki o naszym zaufanym i wiernym PHP, czy mam rację?
Korzystając z tego samego przykładu JSON, ale pozwala przypisać go do zmiennej w celu zmniejszenia niejasności.
Teraz na dobroć PHP, używając file_get_contents i php: // stdin stream wrapper.
lub jak wskazano przy użyciu fgets i już otwartego strumienia przy stałej CLI STDIN .
nJoy!
źródło
$argn
zamiastfgets(STDIN)
$argn
działa z flagą -E lub -R i tylko jeśli zawartość JSON znajduje się w jednym wierszu ...Wersja Native Bash: Działa również dobrze z odwrotnymi ukośnikami (\) i cudzysłowami („)
źródło
Wersja korzystająca z Ruby i http://flori.github.com/json/
lub bardziej zwięźle:
źródło
;
nie jest wymagany w Rubim (jest on używany tylko do konkatenacji instrukcji, które normalnie byłyby w osobnych wierszach w jednym wierszu).Niestety top głosowało odpowiedź, która używa
grep
Zwraca pełny mecz, który nie działa w moim scenariuszu, ale jeśli wiesz, format JSON pozostanie na stałym można użyć lookbehind i uprzedzona wyodrębnić tylko pożądanych wartości.źródło
Jeśli ktoś chce tylko wyodrębnić wartości z prostych obiektów JSON bez potrzeby tworzenia struktur zagnieżdżonych, możliwe jest użycie wyrażeń regularnych bez opuszczania bash.
Oto funkcja, którą zdefiniowałem za pomocą wyrażeń regularnych bash opartych na standardzie JSON :
Ostrzeżenia: obiekty i tablice nie są obsługiwane jako wartość, ale obsługiwane są wszystkie inne typy wartości zdefiniowane w standardzie. Również para zostanie dopasowana bez względu na to, jak głęboko jest w dokumencie JSON, o ile ma dokładnie taką samą nazwę klucza.
Na przykładzie OP:
źródło
Jest łatwiejszy sposób na uzyskanie właściwości z ciągu Json. Korzystając z
package.json
pliku jako przykładu, spróbuj tego:Używamy,
process.env
ponieważ powoduje to umieszczenie zawartości pliku w node.js jako ciągu bez ryzyka, że złośliwe treści umkną cytatom i zostaną przeanalizowane jako kod.źródło
require()
faktycznie może uruchamiać obcy kod, JSON.parse nie.JSON.parse()
i tak, jesteś jednoznacznie bezpieczny ... ale tutaj środowisko wykonawcze JSON odbiera (niezaufaną) zawartość w paśmie z (zaufanym) kodem.JSON.parse()
, to również jesteś bezpieczny, ale to też się tutaj nie zdarza.JSON.parse()
, do kodu . Jesteś przy założeniu, że wprowadzenie dosłownych odwrócone, pojedyncze apostrofy zachowa zawartość dosłownym, ale to zupełnie niebezpieczne założenie, ponieważ dosłowne backticks mogą występować w zawartości pliku (a więc zmienna), a tym samym może zakończyć cytowanie i wprowadź niecytowany kontekst gdzie wartości są wykonywane jako kod.Teraz, gdy Powershell jest wieloplatformowy, pomyślałem, że tam pójdę, ponieważ uważam, że jest dość intuicyjny i niezwykle prosty.
ConvertFrom-Json konwertuje JSON w niestandardowy obiekt Powershell, dzięki czemu można łatwo pracować z właściwościami od tego momentu. Jeśli na przykład chcesz tylko właściwości „id”, po prostu wykonaj następujące czynności:
Jeśli chcesz wywołać całą rzecz z poziomu Basha, musisz nazwać to tak:
Oczywiście istnieje czysty sposób Powershell, aby to zrobić bez zwijania się, co byłoby:
Wreszcie istnieje również „ConvertTo-Json”, który równie łatwo konwertuje obiekt niestandardowy do JSON. Oto przykład:
Który wytworzyłby fajny JSON w ten sposób:
}
Trzeba przyznać, że używanie powłoki Windows na Uniksie jest nieco świętokradcze, ale Powershell jest naprawdę dobry w niektórych rzeczach, a parsowanie JSON i XML to tylko niektóre z nich. To jest strona GitHub dla wersji międzyplatformowej https://github.com/PowerShell/PowerShell
źródło
Ktoś, kto ma również pliki XML, może chcieć spojrzeć na mój Xidel . Jest to cli, niezależny procesor JSONiq . (tzn. obsługuje także XQuery dla przetwarzania XML lub JSON)
Przykładem w pytaniu byłoby:
Lub z moją własną, niestandardową składnią rozszerzenia:
źródło
xidel -s https://api.github.com/users/lambda -e 'name'
(lub-e '$json/name'
, lub-e '($json).name'
).Nie mogę tutaj użyć żadnej z odpowiedzi. Brak dostępnych jq, żadnych tablic powłoki, bez deklarowania, bez grep -P, bez lookbehind i lookahead, bez Pythona, bez Perla, bez Ruby, nie - nawet Bash ... Pozostałe odpowiedzi po prostu nie działają dobrze. JavaScript brzmiał znajomo, ale puszka mówi Nescaffe - więc też nie ma wyjścia :) Nawet jeśli są dostępne, dla mojej prostej potrzeby - byłyby przesadne i powolne.
Jednak niezwykle ważne jest dla mnie uzyskanie wielu zmiennych z sformatowanej w formacie json odpowiedzi mojego modemu. Robię to w mgnieniu oka z bardzo przyciętym BusyBox na moich routerach! Nie ma problemów z używaniem samego awk: wystarczy ustawić ograniczniki i odczytać dane. Dla jednej zmiennej to wszystko!
Pamiętasz, że nie mam tablic? Musiałem przypisać w analizowanym pliku awk 11 zmiennych, których potrzebuję w skrypcie powłoki. Gdziekolwiek spojrzałem, była to misja niemożliwa. Z tym też nie ma problemu.
Moje rozwiązanie jest proste. Ten kod: 1) parsuje plik .json z pytania (faktycznie pożyczyłem próbkę danych roboczych z najbardziej pozytywnej odpowiedzi) i wybrał cytowane dane, a także 2) tworzy zmienne powłoki z poziomu awk, przypisując dowolną nazwaną powłokę nazwy zmiennych.
Brak problemów z pustymi miejscami w środku. W moim zastosowaniu to samo polecenie analizuje długi wynik jednego wiersza. Ponieważ używana jest funkcja eval, to rozwiązanie jest odpowiednie tylko dla zaufanych danych. Łatwo jest dostosować go do pobierania niecytowanych danych. W przypadku ogromnej liczby zmiennych przyrost prędkości krańcowej można osiągnąć przy użyciu else if. Brak tablic oznacza oczywiście: brak wielu rekordów bez dodatkowego majstrowania. Ale tam, gdzie dostępne są tablice, dostosowanie tego rozwiązania jest prostym zadaniem.
@maikel sed odpowiedź prawie działa (ale nie mogę tego komentować). Dla moich ładnie sformatowanych danych - działa. Nie tyle w przykładzie tutaj użytym (brakujące cytaty go odrzucają). Jest to skomplikowane i trudne do modyfikacji. Ponadto nie lubię wykonywać 11 wywołań w celu wyodrębnienia 11 zmiennych. Dlaczego? Zmierzyłem czas 100 pętli wyodrębniając 9 zmiennych: funkcja sed zajęła 48,99 sekundy, a moje rozwiązanie zajęło 0,91 sekundy! Niesprawiedliwe? Wykonywanie tylko jednej ekstrakcji 9 zmiennych: 0,51 vs. 0,02 sek.
źródło
Możesz spróbować czegoś takiego -
źródło
Możesz użyć
jshon
:źródło
Oto jeden ze sposobów, w jaki możesz to zrobić za pomocą awk
źródło
W przypadku bardziej złożonej analizy JSON sugeruję użycie modułu jsonpath w Pythonie (autor: Stefan Goessner) -
sudo easy_install -U jsonpath
Przykładowy plik.json (z http://goessner.net/articles/JsonPath ) -
Parsuj (wyodrębnij wszystkie tytuły książek o cenie <10) -
Wyjdzie -
UWAGA: Powyższy wiersz poleceń nie obejmuje sprawdzania błędów. dla pełnego rozwiązania z kontrolą błędów powinieneś utworzyć mały skrypt Pythona i owinąć kod try-wyjątkiem.
źródło
jsonpath
więc zainstalowałemjsonpath_rw
zamiast tego, więc tutaj jest coś podobnego, możesz spróbować, jeśli powyższe nie działa: 1)/usr/bin/python -m pip install jsonpath-rw
2)cat ~/trash/file.json | /usr/bin/python -c "from jsonpath_rw import jsonpath, parse; import sys,json; jsonpath_expr = parse('store.book[0]'); out = [match.value for match in jsonpath_expr.find(json.load(sys.stdin))]; print out;"
(Użyłem pełnej ścieżki do pliku binarnego python, ponieważ miałem problemy z wieloma pytonami zainstalowany).Jeśli masz php :
Na przykład:
mamy zasób, który zapewnia json z kodami ISO krajów: http://country.io/iso3.json i możemy go łatwo zobaczyć w powłoce z curl:
ale wygląda na niezbyt wygodny i nieczytelny, lepiej parsuj json i zobacz czytelną strukturę:
Ten kod wyświetli coś takiego:
jeśli zagnieżdżono tablice, dane wyjściowe będą wyglądały znacznie lepiej ...
Mam nadzieję, że to pomoże ...
źródło
Istnieje również bardzo proste, ale potężne narzędzie przetwarzania JSON CLI fx - https://github.com/antonmedv/fx
Przykłady
Użyj funkcji anonimowej:
Jeśli nie przejdziesz funkcji anonimowej param => ..., kod zostanie automatycznie przekształcony w funkcję anonimową. Możesz uzyskać dostęp do JSON za pomocą tego słowa kluczowego:
Lub po prostu użyj składni kropkowej:
Możesz przekazać dowolną liczbę anonimowych funkcji zmniejszających JSON:
Możesz zaktualizować istniejący JSON za pomocą operatora spreadu:
Po prostu JavaScript . Nie musisz uczyć się nowej składni.
AKTUALIZACJA 2018-11-06
fx
teraz ma tryb interaktywny ( ! )https://github.com/antonmedv/fx
źródło
To jest kolejna
bash
ipython
hybrydowa odpowiedź. Wysłałem tę odpowiedź, ponieważ chciałem przetwarzać bardziej złożone dane wyjściowe JSON, ale zmniejszając złożoność mojej aplikacji bash. Chcę złamać następujący obiekt JSON z http://www.arcgis.com/sharing/rest/info?f=json wbash
:W poniższym przykładzie utworzyłem własną implementację
jq
iunquote
wykorzystaniepython
. Zauważysz, że po zaimportowaniu obiektu pythonjson
do słownika python możemy używać składni python do nawigacji w słowniku. Aby poruszać się po powyższym, składnia jest następująca:data
data[ "authInfo" ]
data[ "authInfo" ][ "tokenServicesUrl" ]
Używając magii w bash, pomijamy
data
i dostarczamy tylko tekst python po prawej stronie danych, tjjq
jq '[ "authInfo" ]'
jq '[ "authInfo" ][ "tokenServicesUrl" ]'
Uwaga, bez parametrów,
jq
działa jako prettifier JSON. Za pomocą parametrów możemy użyć składni Pythona, aby wyodrębnić wszystko, co chcemy ze słownika, w tym nawigację w słownikach i elementach tablicy.Oto działający przykład, który pokazuje powyższe:
źródło
Zrobiłem to, „analizując” odpowiedź JSON dla określonej wartości, w następujący sposób:
Oczywiście, tutaj $ url będzie adresem URL Twittera, a $ var będzie „tekstem”, aby uzyskać odpowiedź na ten var.
Naprawdę, myślę, że jedyną rzeczą, którą robię OP, jest pominięcie grep dla linii z konkretną zmienną, której szuka. Awk chwyta drugi przedmiot w wierszu i za pomocą sed usuwam cytaty.
Ktoś mądrzejszy ode mnie prawdopodobnie byłby w stanie przemyśleć całą sprawę za pomocą awk lub grep.
Teraz możesz to wszystko zrobić za pomocą tylko sed:
więc bez awk, bez grep ... Nie wiem, dlaczego wcześniej o tym nie myślałem. Hmmm...
źródło
grep | awk | sed
Ised | sed | sed
rurociągi są oszczędnych antipatterns. Twój ostatni przykład można łatwo przepisać,curl "$url" | sed '/text/!d;s/\"text\"://g;s/\"//g;s/\ //g'
ale jak zauważyli inni, jest to podatne na błędy i kruche podejście, które nie powinno być zalecane w pierwszej kolejności.Analiza JSON jest bolesna w skrypcie powłoki. Korzystając z bardziej odpowiedniego języka, utwórz narzędzie, które wyodrębni atrybuty JSON w sposób zgodny z konwencjami skryptowymi powłoki. Możesz użyć swojego nowego narzędzia, aby rozwiązać natychmiastowy problem ze skryptami powłoki, a następnie dodać go do zestawu na przyszłe sytuacje.
Na przykład rozważmy narzędzie jsonlookup takie, że jeśli powiem
jsonlookup access token id
, zwróci identyfikator atrybutu zdefiniowany w tokenie atrybutu zdefiniowanym w ramach dostępu do atrybutu ze standardowego wejścia, którym są prawdopodobnie dane JSON. Jeśli atrybut nie istnieje, narzędzie nic nie zwraca (status wyjścia 1). Jeśli parsowanie się nie powiedzie, wyjdź ze stanu 2 i wyślij wiadomość do stderr. Jeśli wyszukiwanie się powiedzie, narzędzie wydrukuje wartość atrybutu.Po stworzeniu narzędzia uniksowego do precyzyjnego wyodrębniania wartości JSON, możesz łatwo używać go w skryptach powłoki:
Dowolny język zrobi dla implementacji jsonlookup . Oto dość zwięzła wersja Pythona:
źródło
Dwuliniowy, który używa Pythona. Działa to szczególnie dobrze, jeśli piszesz pojedynczy plik .sh i nie chcesz polegać na innym pliku .py. Wykorzystuje również użycie rury
|
.echo "{\"field\": \"value\"}"
można zastąpić czymkolwiek wypisującym json na standardowe wyjście.źródło
To dobry przypadek użycia dla pythonpy :
źródło