Saya punya teks json ini:
{
"buildStatus" : {
"status" : "ERROR",
"conditions" : [{
"status" : "OK",
"metricKey" : "bugs"
}, {
"status" : "ERROR",
"metricKey" : "test_success_density"
}, {
"status" : "OK",
"metricKey" : "vulnerabilities"
}
],
"periods" : []
}
}
Saya ingin mengekstrak status keseluruhan buildStatus, yaitu output yang diharapkan adalah "KESALAHAN"
"buildStatus" : {
"status" : "ERROR",
....
}
Saya mencoba ekspresi sed di bawah, tetapi tidak berhasil, ia kembali OK
:
status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile
Apa yang saya lakukan salah?
sumber
jq
:jq -r .buildStatus.status
Pekerjaan untuk
jq
:Dapat disingkat menjadi:
-r
(--raw-output
) Menghasilkan string tanpajson
pemformatan string yaitu tanpa tanda kutip.Contoh:
Jika belum diinstal, instal dengan (tersedia di gudang Universe):
sumber
Seperti yang telah disebutkan, parsing data terstruktur kompleks lebih disukai dengan API yang sesuai. Python memiliki
json
modul untuk itu, yang secara pribadi saya gunakan cukup banyak dalam skrip saya, dan cukup mudah untuk mengekstrak bidang yang diinginkan seperti yang Anda inginkan:Apa yang terjadi di sini adalah bahwa kita mengarahkan file input ke stdin python, dan membacanya dengan
json.load()
. Itu menjadi kamus python dengan kunci "buildStatus", dan itu berisi kamus python lain dengan kunci "status". Jadi, kami hanya mencetak nilai kunci dalam kamus yang disimpan dalam kamus lain. Cukup sederhana.Selain dari kesederhanaan, keuntungan lain adalah python dan API ini semuanya sudah diinstal sebelumnya dan disertakan dengan Ubuntu secara default.
sumber
Anda sebenarnya dapat melakukan ini
sed
, tetapi saya sangat mendorong Anda untuk menggunakan bahasa yang lebih canggih yang memiliki alat yang ditulis untuk menangani data JSON. Anda bisa mencoba perl atau python, misalnya.Sekarang, dalam contoh sederhana Anda, yang Anda inginkan adalah kemunculan pertama
"status"
, sehingga Anda dapat melakukan:Caranya adalah dengan menggunakan
-n
untuk menghindari pencetakan, maka jika garis cocokstatus
(/status/
), Anda menghapus semuanya kecuali bagian yang Anda inginkans/.*:\s*"(.*)",/\1/
,p
potong garis danq
uit.Secara pribadi, saya menemukan perintah grep yang setara ini jauh lebih sederhana:
Atau yang ini:
Namun serius, jika Anda berencana untuk mem-parsing file JSON, jangan coba lakukan ini secara manual. Gunakan parser JSON yang tepat.
sumber
grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
Tidak mengatakan Anda harus menggunakan
sed
(saya pikir seseorang telah menurunkan saya hanya karena tidak menulis peringatan wajib) tetapi, jika Anda perlu mencari sesuatu di baris berikutnyabuildStatus
karena Anda tampaknya mencoba dalam usaha Anda sendiri, Anda perlu memberitahused
untuk membaca baris selanjutnya denganN
perintahCatatan:
-n
jangan cetak apa pun sampai kami memintanya-r
gunakan ERE (sama seperti-E
)/buildStatus/N
temukan pola ini dan baca baris selanjutnya jugas/old/new/
menggantikanold
dengannew
.*
sejumlah karakter apa pun di telepon\n
garis baru: "(.*)",
simpan semua karakter yang terjadi di antara: "
dan",
\1
referensi kembali ke pola yang disimpanp
cetak bagian yang kami kerjakansumber
Ada penjelasan khas mengapa
sed
dan alat pengolah aliran teks yang serupa tidak dilengkapi dengan baik untuk menguraikan data terstruktur seperti JSON dan XML. Saya tidak memiliki itu di tangan, tetapi itu ada di luar sana, dan saya percaya intinya adalah bahwa ekspresi yang dibutuhkan dalam semua tetapi mungkin situasi paling sedikit dengan cepat menjadi sangat kompleks, sementara alat-alat alternatif yang dibangun khusus untuk mengurai struktur lebih elegan, mudah dibaca, dan efisien di parsing yang sama.Seperti muru telah memberikan komentar ,
jq
harus menjadi alat yang tepat untuk pekerjaan itu. Saya juga dapat menjaminnya secara pribadi sangat bersemangat untuk melihatnya menggantikan beberapa kali di mana saya telah mencoba mengurai data yang sama untuk hampir tidak ada atau membebani kesuksesan. Itu bahkan berisi tentang kemampuan untuk memformat dan mengendalikan output. Saya lebih sukajsontool
karena suatu alasan atau lebih yang saya lupa saat ini.Komandan Byte tampaknya merekomendasikan
jshon
dalam jawaban lain . Saya belum pernah menggunakan alat itu, tetapi mengingatkan saya padaxmlstarlet
dan sintaksnya, juga dengan beberapa presentasi yang dapat disesuaikan untuk hasilnya.sumber
jsontool
dapat digunakan untuk kasus spesifik OPjq
bahwa muru dan heemayl menggambarkan yang sudah memiliki exmaples, dan hanya memposting alasan di baliknya: askubuntu.com/a/863948/230721Hanya alat Json lain yang disebut json ( https://github.com/trentm/json )
Studi kasus ini menyesatkan: sepertinya alat tidak berfungsi. Anda juga dapat menggunakan
json
untuk mengubah file json:atau bahkan...
dokumentasi di: http://trentm.com/json/
jika tidak dipasang:
npm install -g json
sumber