Cara menghuraikan fail JSON dari baris arahan Linux menggunakan JQ

Cara menghuraikan fail JSON dari baris arahan Linux menggunakan JQ

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

Keperluan Perisian dan Konvensyen Talian Perintah Linux
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