Burada cevapların hiçbirini kullanamıyorum. Kullanılabilir jq, kabuk dizisi yok, bildirim yok, grep-P yok, göz ve gözetleme yok, Python yok, Perl yok, Ruby yok, hayır - Bash yok ... Kalan cevaplar iyi çalışmıyor. JavaScript tanıdık geliyordu, ama teneke Nescaffe diyor - bu da bir hareket değil :) Var olsa bile, basit ihtiyacım için - aşırı ve yavaş olurdu.
Yine de, modemimin json formatlı cevabından birçok değişken almak benim için son derece önemlidir. Benim yönlendiriciler çok kesilmiş BusyBox ile bir soydan yapıyorum! Yalnızca awk kullanmakta sorun yok: sadece sınırlayıcıları ayarlayın ve verileri okuyun. Tek bir değişken için hepsi bu!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Dizilerimin olmadığını hatırlıyor musunuz? Ben bir kabuk komut dosyasında gereken 11 değişkenlere awk ayrıştırılmış veri içinde atamak zorunda kaldı. Nereye baksam, bunun imkansız bir görev olduğu söyleniyordu. Bu da sorun değil.
Benim çözümüm basit. Bu kod: 1) sorudan .json dosyasını ayrıştırır (aslında, en çok oylanan cevaptan bir çalışma veri örneği ödünç aldım) ve alıntılanan verileri seçer, artı 2) ücretsiz adlandırılmış kabuk atama awk içinden kabuk değişkenleri oluşturur değişken adları.
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"
Içinde boşluklar ile sorun yok. Benim kullanımımda, aynı komut uzun bir tek satır çıkış ayrıştırır. Eval kullanıldığından, bu çözüm yalnızca güvenilir veriler için uygundur. Verilmemiş verileri almak için uyarlamak kolaydır. Çok sayıda değişken için marjinal hız kazancı, if. Dizi eksikliği açıktır: ekstra uğraşmadan çoklu kayıt yok. Ancak dizilerin bulunduğu yerlerde, bu çözümü uyarlamak basit bir iştir.
@maikel sed cevap neredeyse çalışıyor (ama ben yorum yapamam). Güzel biçimlendirilmiş verilerim için - işe yarıyor. Burada kullanılan örnek ile çok fazla değil (eksik tırnaklar atmak). Karmaşık ve değiştirilmesi zor. Artı, 11 değişken çıkarmak için 11 çağrı yapmak zorunda sevmiyorum. Neden? 9 döngüyü ayıklayarak 100 döngüyü zamanladım: sed işlevi 48.99 saniye ve çözümüm 0.91 saniye sürdü! Adil değil? 9 değişkenli tek bir özümleme yapmak: 0.51 ve 0.02 sn.