Cara menghuraikan fail JSON dari baris arahan Linux menggunakan JQ
- 3940
- 839
- Noah Torp
The Json
Format (Notasi Objek JavaScript) digunakan secara meluas untuk mewakili struktur data, dan sering digunakan untuk menukar data antara lapisan yang berlainan aplikasi, atau dengan penggunaan panggilan API. Kita mungkin tahu bagaimana untuk berinteraksi dengan data yang diformat JSON dengan bahasa pengaturcaraan yang paling banyak digunakan seperti Parsing JSON dengan Python, tetapi bagaimana jika kita perlu berinteraksi dengannya dari baris arahan, atau dalam skrip bash? Dalam artikel ini kita akan melihat bagaimana kita dapat mencapai tugas sedemikian dengan menggunakan jq
utiliti dan kami akan mempelajari penggunaan asasnya.
Dalam tutorial ini anda akan belajar:
- Cara memasang jq dalam pengagihan linux yang paling banyak digunakan atau menyusunnya dari sumber
- Cara Menggunakan JQ Untuk Menguraikan Data Berformat JSON
- Cara Menggabungkan Penapis Menggunakan "," dan "|"
- Cara Menggunakan Panjang, Kekunci, Mempunyai dan Fungsi Peta
Keperluan perisian dan konvensyen yang digunakan
Kategori | Keperluan, konvensyen atau versi perisian yang digunakan |
---|---|
Sistem | Pengedaran-bebas |
Perisian | Permohonan JQ |
Yang lain | Kebiasaan dengan data json dan shell bash |
Konvensyen | # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak |
Pemasangan
The jq
Utiliti dimasukkan ke dalam semua repositori pengagihan Linux utama, oleh itu memasangnya sangat mudah: kami hanya perlu menggunakan pengurus pakej kegemaran kami. Sekiranya kita menggunakan Debian, atau pengedaran berasaskan Debian seperti Ubuntu atau Linux Mint, kita boleh menggunakan Apt
:
$ sudo apt pemasangan jq
Sekiranya kita mempunyai keutamaan untuk keluarga pengagihan Red Hat, seperti fedora, centos atau rhel, kita boleh memasang jq
melalui DNF
Pengurus Pakej (dalam versi baru -baru ini pengagihan itu menggantikan yum). Untuk memasang pakej yang akan kami jalankan:
$ sudo dnf memasang jq
Memasang jq
di archlinux sama mudah. Pengurus Pakej Pengedaran adalah Pacman
, Dan pakejnya terdapat di repositori komuniti. Kami boleh melakukan pemasangan dengan arahan berikut:
$ sudo pacman -s memasang jq
Sekiranya kita tidak dapat, atau atas sebab tertentu kita tidak mahu menggunakan pakej binari yang telah dibina, kita dapat menyusun JQ dari sumber. Dalam
baris berikut kita menerangkan langkah -langkah yang diperlukan.
Membina dan memasang dari sumber
Untuk membina dan memasang JQ dari sumber, perkara pertama yang perlu kita lakukan ialah memuat turun tarball pelepasan. Pada masa ini
menulis, pelepasan terkini yang ada adalah 1.6
. Untuk memuat turun tarball tanpa meninggalkan terminal, kita boleh menggunakan wget
:
$ wget https: // github.com/stedolan/jq/siaran/muat turun/jq-1.6/JQ-1.6.tar.Gz
Sebaik sahaja muat turun selesai, kita mesti menguraikan dan mengeluarkan tarball:
$ tar -xzf jq -1.6.tar.Gz
Langkah seterusnya ialah memasuki JQ-1.6
Direktori, dibuat sebagai hasil daripada arahan terakhir:
$ CD JQ-1.6
Sekarang, untuk menyusun kod sumber yang kita perlukan utiliti berikut:
- GCC
- Automake
- libtool
- buat
Untuk membina perisian yang kami jalankan:
$ autoreconf -fi $ ./konfigurasi && membuat && sudo membuat pemasangan
Salinan The buat pemasangan
perintah, secara lalai, akan menyebabkan binari dipasang di /usr/tempatan/bin
direktori, dan perpustakaan ke /usr/local/lib
. Sekiranya kita mahu menyesuaikan pemasangan, dan menukar direktori tersebut, kita mesti menentukan awalan yang berbeza, menggunakan --awalan
pilihan semasa melancarkan ./konfigurasikan
Skrip.
Contohnya, untuk memasang perisian hanya untuk pengguna tertentu, kami boleh lulus $ Rumah/.tempatan
direktori sebagai awalan: dalam hal ini binari akan dipasang $ Rumah/.tempatan/bin
dan perpustakaan ke $ Rumah/.tempatan/lib
; Dengan konfigurasi sedemikian tidak perlu melancarkan buat pemasangan
perintah dengan keistimewaan pentadbiran. Sekiranya anda ingin mengetahui cara menyusun sumber borang yang dipasang dengan lebih baik, anda boleh menyemak artikel kami mengenai utiliti GNU Stow.
Penggunaan
Sekali kita ada jq
dipasang, kita boleh menggunakannya untuk menghuraikan fail json dari baris arahan. Demi tutorial ini, kami akan bekerjasama dengan struktur data mudah yang mengandungi beberapa butiran mengenai tiga watak dari Lord of the Rings Book. Data disimpan ke watak.json
fail.
The jq
Utiliti berfungsi dengan menggunakan penapis pada aliran data JSON. Sebagai perkara pertama, kami akan menggunakan penapis yang paling mudah, .
, yang mengembalikan data input tidak berubah tetapi cukup dicetak. Untuk ciri ini, ia boleh digunakan untuk memformat data dengan cara yang lebih mudah dibaca:
$ jq . watak.json
Perintah di atas menghasilkan output berikut:
"aksara": ["name": "aragorn", "bangsa": "man", "name": "gimli", "bangsa": "kerdil", "name": "Legolas" , "bangsa": "elf"]
Salinan Sekarang, katakan kami ingin menapis data untuk mendapatkan hanya nilai yang berkaitan dengan watak
kunci. Untuk melaksanakan tugas, kami memberikan nama kunci, dan memperoleh nilainya (atau batal
Sekiranya ia tidak wujud):
$ jq .watak watak.json
Dalam contoh kami nilai yang berkaitan dengan kekunci "Watak" adalah array
, Oleh itu, kami memperoleh hasil berikut:
["Nama": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Dwarf", "Name": "Legolas", "Race": "Elf"]
Salinan Bagaimana jika kita mahu mendapatkan hanya elemen pertama dari array? Kita hanya perlu "mengekstrak" indeks yang betul daripadanya. Mengetahui bahawa array adalah berasaskan sifar
, kita boleh lari:
$ jq .watak [0] watak.json
Perintah memberi kita:
"Nama": "Aragorn", "Race": "Man"
Salinan Kita juga boleh mendapatkan sepotong array. Katakanlah, sebagai contoh, kami hanya ingin mendapatkan dua elemen pertama. Kami berlari:
$ jq .watak [0: 2] watak.json
Perintah memberi kita hasil berikut:
["Nama": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Dwarf"]
Salinan Pengiraan juga berfungsi pada rentetan, jadi jika kita berlari:
$ jq .Watak [0].Nama [0: 2] Watak.json
Kami memperoleh kepingan (dua huruf pertama) rentetan "Aragorn": "Ar"
.
Unsur Arahan Akses secara berasingan
Dalam contoh di atas, kami mencetak kandungan array "aksara", yang terdiri daripada tiga objek yang menggambarkan watak fantasi. Bagaimana jika kita mahu melangkah ke atas array tersebut? Kita mesti membuat sehingga unsur -unsur yang terkandung di dalamnya dikembalikan secara berasingan, jadi kita mesti menggunakan []
tanpa menyediakan indeks:
$ jq .watak [] watak.json
Output arahan adalah:
"Nama": "Aragorn", "Race": "Man" "Nama": "Gimli", "Race": "Dwarf", "Senjata": "Ax" "Nama": "Legolas" , "bangsa": "elf"
Salinan Dalam kes ini, kami memperoleh 3 hasil: objek yang terkandung dalam array. Teknik yang sama boleh digunakan untuk melangkah ke atas nilai -nilai objek, dalam hal ini yang pertama yang terkandung dalam array "aksara":
$ jq .aksara [0] [] aksara.json
Di sini kita memperoleh hasil berikut:
"Aragorn" "Man"
Salinan "," Dan "|" pengendali
"," Dan "|" Pengendali kedua -duanya digunakan untuk menggabungkan dua atau lebih penapis, tetapi mereka bekerja dengan cara yang berbeza. Apabila dua penapis dipisahkan oleh koma, kedua -duanya digunakan, secara berasingan, pada data yang diberikan dan marilah kita mendapatkan dua hasil yang berbeza. Mari lihat contoh:
$ jq '.Watak [0], .aksara [2] 'watak.json
Data yang diformat JSON yang terkandung dalam watak.fail json pertama ditapis dengan .Watak [0]
Dan kemudian dengan .Charaters [2]
, Untuk mendapatkan elemen pertama dan ketiga dari array "Watak". Dengan melaksanakan arahan di atas, kami memperoleh dua berasingan Hasil:
"Nama": "Aragorn", "Race": "Man" "Name": "Legolas", "Race": "Elf"
Salinan "|" Operator berfungsi dengan cara yang berbeza, dalam fesyen yang serupa dengan paip Unix. Output yang dihasilkan oleh penapis di sebelah kiri pengendali, diluluskan sebagai input ke penapis di sebelah kanan pengendali. Jika penapis di sebelah kiri pengendali menghasilkan pelbagai hasil, penapis di sebelah kanan pengendali digunakan untuk setiap satu daripada mereka:
$ jq '.Watak [] | .Namakan 'watak.json
Dalam contoh ini kita mempunyai dua penapis. Di sebelah kiri pengendali kami mempunyai .watak[]
penapis, yang pernah kita lihat sebelum ini, marilah kita mendapatkan unsur -unsur array "aksara" sebagai hasil yang berasingan. Dalam kes kita, setiap hasil adalah objek dengan "Nama"
dan "Perlumbaan"
sifat. The .nama
penapis di sebelah kanan |
Pengendali digunakan untuk setiap objek, jadi kami memperoleh hasil berikut:
"Aragorn" "Gimli" "Legolas"
Salinan Fungsi
Utiliti JQ merangkumi beberapa fungsi yang sangat berguna yang boleh kita gunakan untuk data yang diformat JSON. Kami sekarang akan melihat sebahagian daripada mereka: panjang
, Kunci
, mempunyai
dan peta
.
Fungsi panjang
Yang pertama yang akan kita bicarakan adalah panjang
, yang, seperti namanya, marilah kita mengambil panjang objek, tatasusunan dan rentetan. Panjang objek adalah bilangan pasangan nilai utama mereka; Panjang tatasusunan diwakili oleh bilangan elemen yang mereka ada; panjang rentetan adalah bilangan aksara yang terdiri daripada. Mari lihat cara menggunakan fungsi. Katakan kita ingin mengetahui panjang array "aksara", kita lari:
$ jq '.Watak | panjang 'aksara.json
Seperti yang dijangkakan, kami memperoleh 3
Hasilnya, kerana ia adalah bilangan elemen dalam array. Dengan cara yang sama, untuk mendapatkan panjang objek pertama dalam array yang dapat kami jalankan:
$ jq '.Watak [0] | panjang 'aksara.json
Kali ini kita memperoleh 2
Hasilnya, kerana ia adalah bilangan pasangan nilai yang terkandung dalam objek. Seperti yang telah kita katakan, fungsi yang sama digunakan untuk rentetan, mengembalikan bilangan aksara yang terkandung di dalamnya, jadi, sebagai contoh, berjalan:
$ jq '.Watak [0].Nama | panjang 'aksara.json
Kami menerima 7
Hasilnya, yang merupakan panjang rentetan "Aragorn".
Fungsi kunci
The Kunci
fungsi boleh digunakan pada objek atau tatasusunan. Dalam kes pertama ia mengembalikan pelbagai yang mengandungi
kekunci objek:
$ jq '.Watak [0] | watak kunci.json ["nama", "bangsa"]
Salinan Apabila digunakan pada array, ia mengembalikan array lain yang mengandungi indeks yang pertama:
$ jq '.Watak | watak kunci.JSON [0, 1, 2]
Salinan The Kunci
fungsi mengembalikan unsur -unsur yang disusun: Jika kita mahu unsur -unsur dikembalikan dalam urutan sisipan, kita boleh menggunakan Keys_unsorted
fungsi sebaliknya.
Memeriksa jika objek mempunyai kunci
Satu operasi yang sangat biasa yang mungkin kita mahu lakukan pada objek, memeriksa sama ada ia mengandungi kunci tertentu. Untuk melaksanakan tugas ini, kita boleh menggunakan mempunyai
fungsi. Sebagai contoh, untuk menyemak sama ada objek utama data Format JSON kami mengandungi kunci "Senjata", kami boleh menjalankan:
$ jq 'mempunyai ("senjata") aksara.json palsu
Salinan Dalam kes ini, seperti yang dijangkakan, fungsi itu dikembalikan salah
Oleh kerana objek hanya mengandungi kunci "aksara":
$ jq 'mempunyai ("aksara")' aksara.json benar
Salinan Apabila digunakan untuk tatasusunan, fungsi itu kembali benar jika array mempunyai elemen pada indeks yang diberikan atau sebaliknya:
$ jq '.Watak | mempunyai (3) 'watak.json palsu
Salinan Arahan "Watak" hanya mempunyai 3 elemen; Array adalah diindeks sifar, jadi periksa jika array sebagai elemen yang berkaitan dengan indeks 3
pulangan salah
.
Fungsi peta
Fungsi peta marilah kita memohon penapis untuk setiap elemen array yang diberikan. Sebagai contoh, katakan kami ingin memeriksa kewujudan kekunci "Nama" dalam setiap objek yang terkandung dalam array "Watak". Kita boleh menggabungkan peta
dan mempunyai
fungsi dengan cara ini:
$ jq '.Watak | Peta (mempunyai ("nama")) 'watak.JSON [Benar, BENAR, BENAR]
Salinan Kesimpulan
Dalam artikel ini kita hampir tidak menggaru permukaan ciri -ciri yang ditawarkan oleh jq
Utiliti yang membolehkan kita menghuraikan dan memanipulasi data format json dari baris arahan. Kami mempelajari penggunaan asas program, bagaimana "," dan "|" Pengendali bekerja, dan cara menggunakan fungsi panjang, kunci, mempunyai, dan peta, masing -masing memperolehi array, rentetan dan objek, mendapatkan kunci objek atau indeks array, periksa sama ada kunci wujud dalam objek atau jika array mempunyai array elemen pada indeks yang diberikan, dan gunakan penapis atau fungsi ke setiap elemen array. Untuk mengetahui semua jq
boleh buat, pergi dan lihat manual program!
Tutorial Linux Berkaitan:
- Cara Bekerja Dengan API Rest WooCommerce dengan Python
- Perkara yang hendak dipasang di Ubuntu 20.04
- Pengenalan kepada Gelung JavaScript
- Cara Mengesan Sistem Panggilan yang Dibuat oleh Proses Dengan Strace On ..
- Menguasai Gelung Skrip Bash
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Manipulasi data besar untuk keseronokan dan keuntungan bahagian 1
- Gelung bersarang dalam skrip bash
- Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
- Cara menggunakan skrip bash untuk menjalankan skrip python anda