Cara menguraikan file json dari baris perintah linux menggunakan jq
- 1153
- 232
- Simon Cormier
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
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