Non posso usare nessuna delle risposte qui. Nessun jq disponibile, nessun array di shell, nessuna dichiarazione, nessun grep -P, nessun lookbehind e lookahead, nessun Python, nessun Perl, nessun Ruby, no - nemmeno Bash ... Le restanti risposte semplicemente non funzionano bene. JavaScript sembrava familiare, ma la scatola dice Nescaffe - quindi è un non andare anche :) :) Anche se disponibili, per la mia semplice necessità - sarebbero eccessivi e lenti.
Tuttavia, è estremamente importante per me ottenere molte variabili dalla risposta in formato json del mio modem. Lo sto facendo in un attimo con BusyBox molto ridotto sui miei router! Nessun problema usando solo awk: basta impostare i delimitatori e leggere i dati. Per una singola variabile, tutto qui!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Ricordi che non ho array? Ho dovuto assegnare all'interno dei dati analizzati awk alle 11 variabili di cui ho bisogno in uno script di shell. Ovunque guardassi, si diceva che fosse una missione impossibile. Nessun problema anche con quello.
La mia soluzione è semplice Questo codice: 1) analizzerà il file .json dalla domanda (in realtà, ho preso in prestito un campione di dati di lavoro dalla risposta più votata) e selezionerà i dati citati, più 2) creerà le variabili della shell all'interno del awk assegnando la shell denominata libera nomi di variabili.
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"
Nessun problema con gli spazi vuoti all'interno. Nel mio uso, lo stesso comando analizza un output a riga singola lunga. Poiché viene utilizzato eval, questa soluzione è adatta solo per dati affidabili. È semplice adattarlo per raccogliere dati non quotati. Per un numero enorme di variabili, il guadagno di velocità marginale può essere ottenuto usando altro se. La mancanza di array ovviamente significa: nessun record multiplo senza armeggiare ulteriormente. Ma laddove sono disponibili array, l'adattamento di questa soluzione è un compito semplice.
@maikel sed answer funziona quasi (ma non posso commentarlo). Per i miei dati ben formattati, funziona. Non tanto con l'esempio usato qui (le virgolette mancanti lo scaricano). È complicato e difficile da modificare. Inoltre, non mi piace dover effettuare 11 chiamate per estrarre 11 variabili. Perché? Ho cronometrato 100 loop estraendo 9 variabili: la funzione sed ha richiesto 48,99 secondi e la mia soluzione ha impiegato 0,91 secondi! Non è giusto? Eseguendo una sola estrazione di 9 variabili: 0,51 vs. 0,02 sec.