Bagaimana saya bisa melewatkan output JSON pada shell?
Misalnya, Amazon Web Services menyediakan CLI untuk mengambil status mesin virtual Anda:
$ aws ec2 describe-instances <my_instance_id>
Tetapi perintah mengembalikan string JSON. Output dari perintah itu terlihat seperti ini:
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
Apakah ada built-in shell yang dapat digunakan untuk mem-parsing output JSON?
Sebagai contoh, saya ingin menangkap dalam variabel shell FOO
, berikut ini output["Reservations"]["SecurityGroups"][0]{"Foo"}
.
Jika itu membantu, saya secara khusus tertarik pada solusi yang dapat bekerja dari Zsh.
--output text
jika Anda ingin mengurai shell tanpa menggunakan alat eksternal sepertijshon
.jshon
untuk pertama kalinya, saya mengikuti tautan Anda. Setelah membaca itu, saya hanya bisa mengatakan bahwa saya pergi dengan sangat senang bahwa, kebetulan, saya mendengar dan menginstalnyajq
terlebih dahulu. Saya pikir Anda mungkin ingin mendengarnya juga jika Anda belum - itu tidak mengganggu dengan semua saklar baris perintah dan dapat melakukan regex sendiri - bahkan memungkinkan Anda untuk mendeklarasikan fungsi dan variabel jika Anda mau. Lihat jawabannya di sini tentang hal itu jika Anda tertarik.Jawaban:
Seperti yang saya pahami, Anda mencari nilai "Foo". Ini sangat mudah dilakukan dengan alat baris perintah shell
jq
. Itu adalah sesuatu sepertised
di mana ia mengimplementasikan jenis bahasa pengurai sendiri. Diberikan contoh Anda:jq
bisayes
dengan mudah:KELUARAN
Anda dapat berjalan melalui hash objek atau daftar kamus menggunakan
.dot
notasi, dan array yang diindeks dapat diindeks lebih sederhana, dengan, karena Anda mungkin menebak, numerik, indeks kurung siku. Dalam perintah di atas saya menggunakan formulir indeks kosong untuk menunjukkan bahwa saya ingin semua item yang dapat diubah tingkat itu diperluas. Itu mungkin lebih mudah dipahami dengan cara ini:... yang membagi semua nilai untuk item tingkat kedua di hash dan membuat saya ...
Ini nyaris tidak menggores permukaan sehubungan dengan
jq
kemampuan. Ini adalah alat yang sangat kuat untuk membuat serialisasi data di shell, ini mengkompilasi ke biner tunggal yang dapat dieksekusi dalam gaya Unix klasik, sangat mungkin tersedia melalui manajer paket untuk distribusi Anda, dan itu didokumentasikan dengan sangat baik. Silahkan kunjungi nyagit
-Page dan lihat sendiri.Omong-omong, cara lain untuk menangani data berlapis
json
- setidaknya untuk mendapatkan ide tentang apa yang Anda kerjakan - mungkin dengan cara lain dan menggunakan.dot
notasi untuk membagi semua nilai di semua tingkatan seperti:Tetapi jauh lebih baik, mungkin, hanya akan menggunakan salah satu dari banyak metode penemuan atau pencarian yang
jq
menawarkan berbagai jenis node.sumber
Ini adalah jawaban untuk tujuan Anda, tetapi bukan pertanyaan Anda. Berarti Anda dapat mencapai tujuan Anda tanpa menggunakan parser JSON.
Pemanfaatan AWS memiliki kemampuan untuk hanya output bidang pilih menggunakan
--query
argumen. Ini didokumentasikan di sini .Sebagai contoh:
Anda bahkan dapat memilih beberapa bidang jika ingin:
Dan Anda juga dapat menampilkan beberapa struct yang cocok:
sumber