Mam ten tekst JSON:
{
"buildStatus" : {
"status" : "ERROR",
"conditions" : [{
"status" : "OK",
"metricKey" : "bugs"
}, {
"status" : "ERROR",
"metricKey" : "test_success_density"
}, {
"status" : "OK",
"metricKey" : "vulnerabilities"
}
],
"periods" : []
}
}
Chcę wyodrębnić ogólny status buildStatus, tzn. Oczekiwany wynik to „ERROR”
"buildStatus" : {
"status" : "ERROR",
....
}
Próbowałem poniższego wyrażenia sed, ale nie działa, zwraca OK
:
status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile
Co ja robię źle?
źródło
jq
:jq -r .buildStatus.status
Praca dla
jq
:Można skrócić do:
-r
(--raw-output
) wyświetla ciąg bezjson
formatowania ciągu, tzn. bez cudzysłowów.Przykład:
Jeśli jeszcze nie został zainstalowany, zainstaluj go przez (dostępny w repozytorium Universe):
źródło
Jak już wspomniano, parsowanie złożonych danych strukturalnych jest lepsze przy odpowiednim API. Python ma
json
do tego moduł, którego osobiście używam dość często w moich skryptach i dość łatwo jest wyodrębnić pożądane pola, tak jak chcesz:To, co się tutaj dzieje, polega na tym, że przekierowujemy plik wejściowy na standardowe wejście Pythona i czytamy to za pomocą
json.load()
. Staje się słownikiem Pythona z kluczem „buildStatus” i zawiera inny słownik Pythona z kluczem „status”. Dlatego po prostu wypisujemy wartość klucza w słowniku, który jest przechowywany w innym słowniku. Dość proste.Oprócz prostoty, kolejną zaletą jest to, że Python i ten interfejs API są wstępnie zainstalowane i domyślnie dostarczane z Ubuntu.
źródło
Możesz to zrobić w rzeczywistości
sed
, ale zdecydowanie zachęcam do korzystania z bardziej wyrafinowanego języka, w którym są napisane narzędzia do obsługi danych JSON. Możesz na przykład wypróbować Perla lub Pythona.Teraz, w twoim prostym przykładzie, wszystko czego chcesz to pierwsze wystąpienie
"status"
, więc możesz zrobić:Sztuczka polega na tym,
-n
aby uniknąć drukowania, a jeśli linia pasujestatus
(/status/
), usuwasz wszystko oprócz wybranej częścis/.*:\s*"(.*)",/\1/
p
żądanej , rintujesz linię iq
używasz.Osobiście uważam, że to równoważne polecenie grep jest znacznie prostsze:
Albo ten:
Poważnie jednak, jeśli planujesz analizować pliki JSON, nie próbuj tego robić ręcznie. Użyj właściwego parsera JSON.
źródło
grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
Nie twierdzę, że należy użyć
sed
(chyba ktoś downvoted mi tylko nie pisać obowiązkowe zastrzeżenie), ale jeśli trzeba szukać czegoś na kolejnej linii dobuildStatus
jak to wydaje się być trudny w swoim własnym próbie, trzeba powiedziećsed
, aby przeczytać następny wiersz zN
poleceniemUwagi:
-n
nie drukuj niczego, dopóki nie poprosimy o to-r
użyj ERE (tak samo jak-E
)/buildStatus/N
znajdź ten wzór i przeczytaj także następny wierszs/old/new/
wymienićold
znew
.*
dowolna liczba dowolnych znaków w linii\n
Nowa linia: "(.*)",
zapisz wszystkie znaki występujące pomiędzy: "
a",
\1
odniesienie do zapisanego wzorup
wydrukuj część, nad którą pracowaliśmyźródło
Istnieje typowe wyjaśnienie, dlaczego
sed
i podobne narzędzia do przetwarzania strumienia tekstu nie są dobrze przygotowane do analizowania danych strukturalnych, takich jak JSON i XML. Nie mam tego pod ręką, ale jest na zewnątrz i uważam, że chodzi o to, że wyrażenia potrzebne we wszystkich, ale prawdopodobnie w najmniejszej liczbie sytuacji, szybko stają się bardzo złożone, podczas gdy alternatywne narzędzia zbudowane specjalnie do analizowania struktury są bardziej elegancki, czytelny i wydajny przy tym samym parsowaniu.Jak muru włożył w komentarzu ,
jq
powinny być odpowiednim narzędziem do pracy. Mogę też ręczyć za to, że osobiście jestem bardzo podekscytowany, widząc, że zastępuje go kilka razy, gdy próbowałem parsować te same dane, nie osiągając prawie żadnego sukcesu lub obciążonego. Zawiera nawet wiele informacji o możliwościach formatowania i kontrolowania wyników w inny sposób. Wolę to zjsontool
jakiegoś powodu, którego obecnie zapominam.Bajt dowódca wydaje polecić
jshon
w innej odpowiedzi . Nie korzystałem z tego narzędzia, ale przypomina mi ono oxmlstarlet
jego składni, a także o dostosowywanej prezentacji danych wyjściowych.źródło
jsontool
można wykorzystać ją w konkretnym przypadku OPjq
polecałem Muru i heemaylowi, że mają już przykłady, i po prostu podałem uzasadnienie: askubuntu.com/a/863948/230721Po prostu kolejne narzędzie Json o nazwie json ( https://github.com/trentm/json )
To studium przypadku wprowadza w błąd: wygląda na to, że narzędzia nie działają. Możesz także użyć
json
do zmiany plików Json:lub nawet...
dokumentacja w: http://trentm.com/json/
jeśli nie jest zainstalowany:
npm install -g json
źródło