Cara menguraikan file json dari baris perintah linux menggunakan jq

Cara menguraikan file json dari baris perintah linux menggunakan jq

Itu Json (Notasi objek JavaScript) Format banyak digunakan untuk mewakili struktur data, dan sering digunakan untuk bertukar data antara berbagai lapisan aplikasi, atau dengan menggunakan panggilan API. Kita mungkin tahu bagaimana berinteraksi dengan data yang diformat JSON dengan bahasa pemrograman yang paling banyak digunakan seperti parsing JSON dengan python, tetapi bagaimana jika kita perlu berinteraksi dengannya dari baris perintah, atau dalam skrip bash bash? Dalam artikel ini kita akan melihat bagaimana kita dapat menyelesaikan tugas seperti itu dengan menggunakan jq utilitas dan kami akan mempelajari penggunaan dasarnya.

Dalam tutorial ini Anda akan belajar:

  • Cara menginstal JQ di distribusi Linux yang paling banyak digunakan atau mengkompilasinya dari sumber
  • Cara menggunakan jq untuk parse data yang diformat JSON
  • Cara menggabungkan filter menggunakan "," dan "|"
  • Cara menggunakan panjang, kunci, memiliki dan memetakan fungsi



Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi-independen
Perangkat lunak Aplikasi JQ
Lainnya Keakraban dengan data JSON dan shell bash
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Instalasi

Itu jq Utilitas termasuk dalam semua repositori distribusi Linux utama, oleh karena itu menginstalnya sangat mudah: kami hanya perlu menggunakan manajer paket favorit kami. Jika kami menggunakan Debian, atau distribusi berbasis Debian seperti Ubuntu atau Linux Mint, kami dapat menggunakan tepat:

$ sudo apt install jq


Jika kami memiliki preferensi untuk keluarga distribusi Red Hat, seperti Fedora, Centos atau RHEL, kami dapat menginstal jq Melalui dnf Manajer Paket (dalam versi terbaru dari distribusi yang digantikannya). Untuk menginstal paket yang akan kami jalankan:

$ sudo dnf menginstal jq

Menginstal jq Di Archlinux sama mudahnya. Manajer paket distribusi adalah Pacman, dan paket tersedia di repositori komunitas. Kami dapat melakukan instalasi dengan perintah berikut:

$ sudo pacman -s instal jq

Jika kami tidak bisa, atau karena alasan tertentu kami tidak ingin menggunakan paket biner yang sudah dibangun, kami dapat mengkompilasi jq dari sumber. Di dalam
baris berikut kami menggambarkan langkah yang dibutuhkan.

Membangun dan memasang dari sumber

Untuk membangun dan menginstal JQ dari sumber, hal pertama yang harus kita lakukan adalah mengunduh rilis Tarball. Pd saat itu
Menulis, rilis terbaru yang tersedia adalah 1.6. Untuk mengunduh tarball tanpa meninggalkan terminal, kami dapat menggunakan wget:

$ wget https: // github.com/stedolan/jq/rilis/download/jq-1.6/jq-1.6.ter.GZ

Setelah unduhan selesai, kita harus mendekompresi dan mengekstrak tarball:

$ tar -xzf jq -1.6.ter.GZ

Langkah selanjutnya adalah memasukkan JQ-1.6 direktori, dibuat sebagai hasil dari perintah terakhir:

$ CD JQ-1.6

Sekarang, untuk mengkompilasi kode sumber, kita membutuhkan utilitas berikut:

  • GCC
  • Automake
  • libtool
  • membuat

Untuk membangun perangkat lunak yang kami jalankan:

$ autoreconf -fi $ ./Configure && Make && Sudo Make Install 
Menyalin

Itu buat instal Perintah, secara default, akan menyebabkan binari dipasang di /usr/lokal/bin direktori, dan perpustakaan ke /usr/lokal/lib. Jika kami ingin menyesuaikan instalasi, dan mengubah direktori tersebut, kami harus menentukan awalan yang berbeda, menggunakan --awalan opsi saat meluncurkan ./Mengkonfigurasi naskah.

Misalnya, untuk menginstal perangkat lunak hanya untuk pengguna tertentu, kami dapat melewati $ Rumah/.lokal Direktori sebagai awalan: Dalam hal ini binari akan dipasang $ Rumah/.lokal/bin dan perpustakaan ke $ Rumah/.lokal/lib; dengan konfigurasi seperti itu tidak perlu meluncurkan buat instal Perintah dengan hak administratif. Jika Anda ingin tahu cara mengatur sumber formulir yang diinstal perangkat lunak dengan lebih baik, Anda dapat memeriksa artikel kami tentang utilitas GNU Stow.

Penggunaan

Setelah kita punya jq diinstal, kita dapat menggunakannya untuk parse file json dari baris perintah. Demi tutorial ini, kami akan bekerja dengan struktur data sederhana yang berisi beberapa detail tentang tiga karakter dari buku Lord of the Rings. Data disimpan ke karakter.json mengajukan.

Itu jq Utilitas bekerja dengan menerapkan filter pada aliran data JSON. Sebagai hal pertama, kami akan menggunakan filter paling sederhana, ., yang mengembalikan data input yang tidak berubah tetapi dicetak cukup. Untuk karakteristik ini, dapat digunakan untuk memformat data dengan cara yang lebih mudah dibaca:

$ jq . karakter.json

Perintah di atas menghasilkan output berikut:

"karakter": ["name": "aragorn", "race": "man", "name": "gimli", "ras": "dwarf", "name": "legolas" , "ras": "elf"] 
Menyalin

Sekarang, misalkan kita ingin memfilter data untuk hanya memperoleh nilai yang terkait dengan karakter kunci. Untuk menyelesaikan tugas, kami memberikan nama kunci, dan mendapatkan nilainya (atau batal Jika tidak ada):

$ jq .Karakter Karakter.json

Dalam contoh kami nilai yang terkait dengan kunci "karakter" adalah sebuah Himpunan, Jadi kami mendapatkan hasil berikut:

["name": "aragorn", "race": "man", "name": "gimli", "ras": "dwarf", "name": "legolas", "ras": "peri"]
Menyalin

Bagaimana jika kita hanya ingin mendapatkan elemen pertama dari array? Kita hanya perlu "mengekstrak" indeks yang tepat darinya. Mengetahui bahwa array itu berbasis nol, kita bisa menjalankan:

$ jq .Karakter [0] Karakter.json


Perintah memberi kita:

"name": "aragorn", "ras": "man" 
Menyalin

Kami juga bisa mendapatkan sepotong array. Katakanlah, misalnya, kami hanya ingin mendapatkan dua elemen pertamanya. Kita lari:

$ jq .Karakter [0: 2] Karakter.json

Perintah memberi kita hasil berikut:

["name": "aragorn", "race": "man", "name": "gimli", "ras": "dwarf"] 
Menyalin

Mengiris pekerjaan juga pada string, jadi jika kita menjalankan:

$ jq .Karakter [0].Nama [0: 2] Karakter.json

Kami mendapatkan irisan (dua huruf pertama) dari string "Aragorn": "AR".

Akses elemen array secara terpisah

Dalam contoh di atas kami mencetak konten array "karakter", yang terdiri dari tiga objek yang menggambarkan karakter fantasi. Bagaimana jika kita ingin mengulangi array tersebut? Kita harus membuat agar elemen yang terkandung di dalamnya dikembalikan secara terpisah, jadi kita harus menggunakan [] tanpa memberikan indeks apa pun:

$ jq .karakter [] karakter.json

Output dari perintah adalah:

"name": "aragorn", "race": "man" "name": "gimli", "ras": "dwarf", "weapon": "ax" "name": "legolas" , "ras": "elf" 
Menyalin

Dalam hal ini kami memperoleh 3 hasil: objek yang terkandung dalam array. Teknik yang sama dapat digunakan untuk mengulangi nilai -nilai suatu objek, dalam hal ini yang pertama terkandung dalam array "karakter":

$ jq .Karakter [0] [] Karakter.json

Di sini kita mendapatkan hasil berikut:

"Aragorn" "Man" 
Menyalin

"," Dan "|" operator

"," Dan "|" Operator keduanya digunakan untuk menggabungkan dua atau lebih filter, tetapi mereka bekerja dengan cara yang berbeda. Ketika dua filter dipisahkan oleh koma, keduanya diterapkan, secara terpisah, pada data yang diberikan dan mari kita dapatkan dua hasil yang berbeda. Mari kita lihat contoh:

$ jq.Karakter [0], .Karakter [2] 'Karakter.json

Data yang diformat JSON yang terkandung dalam karakter.File JSON pertama kali difilter .Karakter [0] dan kemudian dengan .Charaaters [2], Untuk mendapatkan elemen pertama dan ketiga dari array "karakter". Dengan melaksanakan perintah di atas, kami mendapatkan dua memisahkan Hasil:

"name": "aragorn", "ras": "man" "name": "legolas", "race": "elf"
Menyalin

The "|" Operator bekerja secara berbeda, dengan cara yang mirip dengan pipa Unix. Output yang dihasilkan oleh filter di sebelah kiri operator, dilewatkan sebagai input ke filter di sebelah kanan operator. Jika filter di sebelah kiri operator menghasilkan banyak hasil, filter di sebelah kanan operator diterapkan untuk masing -masing:

$ jq.Karakter [] | .nama karakter.json

Dalam contoh ini kami memiliki dua filter. Di sebelah kiri operator kami memiliki .karakter [] filter, yang seperti yang kita lihat sebelumnya, mari kita dapatkan elemen dari array "karakter" sebagai hasil terpisah. Dalam kasus kami, setiap hasil adalah objek dengan "nama" Dan "balapan" properti. Itu .nama filter di sebelah kanan | Operator diterapkan pada masing -masing objek, jadi kami mendapatkan hasil berikut:

"Aragorn" "Gimli" "Legolas"
Menyalin

Fungsi

Utilitas JQ mencakup beberapa fungsi yang sangat berguna yang dapat kami terapkan pada data yang diformat JSON. Kami sekarang akan melihat beberapa dari mereka: panjang, kunci, memiliki Dan peta.



Fungsi panjangnya

Yang pertama yang akan kita bicarakan adalah panjang, Yang, seperti namanya, mari kita mengambil panjang objek, array dan string. Panjang objek adalah jumlah pasangan nilai kunci mereka; Panjang array diwakili oleh jumlah elemen yang dikandungnya; Panjang string adalah jumlah karakter yang terdiri darinya. Mari kita lihat cara menggunakan fungsinya. Misalkan kita ingin mengetahui panjang array "karakter", kita menjalankan:

$ jq.Karakter | karakter panjang.json

Seperti yang diharapkan, kami mendapatkan 3 Akibatnya, karena itu adalah jumlah elemen dalam array. Dengan cara yang sama, untuk mendapatkan panjang objek pertama dalam array yang bisa kita jalankan:

$ jq.Karakter [0] | karakter panjang.json

Kali ini kami dapatkan 2 Akibatnya, karena itu adalah jumlah pasangan nilai yang terkandung dalam objek. Seperti yang sudah kami katakan, fungsi yang sama diterapkan pada string, mengembalikan jumlah karakter yang terkandung di dalamnya, jadi, misalnya, berjalan:

$ jq.Karakter [0].Nama | karakter panjang.json

Kami menerima 7 Akibatnya, yang panjangnya string "aragorn".

Fungsi kunci

Itu kunci Fungsi dapat diterapkan pada objek atau array. Dalam kasus pertama ia mengembalikan array yang berisi
Kunci objek:

$ jq.Karakter [0] | Karakter Keys.json ["name", "race"]
Menyalin

Ketika diterapkan pada array, ia mengembalikan array lain yang berisi indeks yang pertama:

$ jq.Karakter | Karakter Keys.json [0, 1, 2] 
Menyalin

Itu kunci fungsi mengembalikan elemen yang diurutkan: Jika kita ingin elemen dikembalikan dalam urutan penyisipan, kita dapat menggunakan keys_unsorted berfungsi sebagai gantinya.

Memeriksa apakah suatu objek memiliki kunci

Salah satu operasi yang sangat umum yang mungkin ingin kami lakukan pada suatu objek, adalah memeriksa jika berisi kunci tertentu. Untuk menyelesaikan tugas ini, kita dapat menggunakan memiliki fungsi. Misalnya, untuk memeriksa apakah objek utama data yang diformat JSON kami berisi kunci "senjata", kami dapat menjalankan:

$ jq 'memiliki ("senjata")' karakter.json false
Menyalin

Dalam hal ini, seperti yang diharapkan, fungsi kembali PALSU Karena objek hanya berisi kunci "karakter":

$ jq 'memiliki ("karakter")' karakter.json true
Menyalin

Ketika diterapkan pada array, fungsi mengembalikan true jika array memiliki elemen pada indeks yang diberikan atau salah, sebaliknya:

$ jq.Karakter | memiliki (3) 'karakter.json false
Menyalin

Array "karakter" hanya memiliki 3 elemen; Array diindeks nol, jadi memeriksa apakah array sebagai elemen yang terkait dengan indeks 3 kembali PALSU.

Fungsi peta

Fungsi peta mari kita terapkan filter ke setiap elemen dari array yang diberikan. Misalnya, katakanlah kami ingin memeriksa keberadaan kunci "nama" di setiap objek yang terkandung dalam array "karakter". Kita bisa menggabungkan peta Dan memiliki berfungsi dengan cara ini:

$ jq.Karakter | peta (memiliki ("name")) 'karakter.json [Benar, Benar, Benar] 
Menyalin

Kesimpulan

Dalam artikel ini kami hampir tidak menggaruk permukaan fitur yang ditawarkan oleh jq utilitas yang memungkinkan kami menguraikan dan memanipulasi data yang diformat JSON dari baris perintah. Kami mempelajari penggunaan dasar program, bagaimana "," dan "|" operator bekerja, dan cara menggunakan panjang, kunci, memiliki, dan memetakan fungsi, untuk masing -masing mendapatkan lenght array, string dan objek, mendapatkan kunci objek atau indeks array, periksa apakah kunci ada dalam suatu objek atau jika array memiliki elemen pada indeks yang diberikan, dan menerapkan filter atau fungsi untuk setiap elemen array. Untuk menemukan semua jq dapat melakukan, pergi dan melihat manual program!

Tutorial Linux Terkait:

  • Bagaimana bekerja dengan WooCommerce Rest API dengan Python
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Pengantar JavaScript Loops
  • Cara melacak panggilan sistem yang dilakukan oleh proses dengan strace di…
  • Menguasai loop skrip bash
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 1
  • Loop bersarang dalam skrip bash
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Cara menggunakan skrip bash untuk menjalankan skrip python Anda