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!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
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.
eval $( curl -s 'https://api.github.com/users/lambda' |
awk ' BEGIN { FS="\""; RS="," };
{
if ($2 == "login") { print "Login=\""$4"\"" }
if ($2 == "name") { print "Name=\""$4"\"" }
if ($2 == "updated_at") { print "Updated=\""$4"\"" }
}' )
echo "$Login, $Name, $Updated"
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.