Lihat dokumentasi paket
jc
Python untuk pengembang
Coba demo web
jc
dan REST API
jc
tersedia sebagai plugin filter yang mungkin di koleksicommunity.general
. Lihat postingan blog ini sebagai contoh.
Konversi JSON
jc
JSONifikasi output dari banyak alat CLI, tipe file, dan string umum untuk memudahkan penguraian skrip. Lihat bagian Parser untuk perintah, tipe file, dan string yang didukung.
dig example.com | jc --dig
[{ "id" : 38052 , "opcode" : " QUERY " , "status" : " NOERROR " , "flags" :[ " qr " , " rd " , " ra " ],
"query_num" : 1 , "answer_num" : 1 , "authority_num" : 0 , "additional_num" : 1 ,
"opt_pseudosection" :{ "edns" :{ "version" : 0 , "flags" :[], "udp" : 4096 }}, "question" :
{ "name" : " example.com. " , "class" : " IN " , "type" : " A " }, "answer" :[{ "name" :
" example.com. " , "class" : " IN " , "type" : " A " , "ttl" : 39049 , "data" : " 93.184.216.34 " }],
"query_time" : 49 , "server" : " 2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1) " ,
"when" : " Fri Apr 16 16:09:00 PDT 2021 " , "rcvd" : 56 , "when_epoch" : 1618614540 ,
"when_epoch_utc" : null }]
Hal ini memungkinkan pemrosesan output baris perintah lebih lanjut dengan alat seperti jq
atau jello
dengan memipakan perintah:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
atau menggunakan sintaks "ajaib" alternatif:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
juga dapat digunakan sebagai perpustakaan python. Dalam hal ini nilai yang dikembalikan akan berupa kamus python, daftar kamus, atau bahkan kamus yang dapat diubah, bukan JSON:
> >> import subprocess
> >> import jc
> >>
>> > cmd_output = subprocess . check_output ([ 'dig' , 'example.com' ], text = True )
> >> data = jc . parse ( 'dig' , cmd_output )
> >>
>> > data [ 0 ][ 'answer' ]
[{ 'name' : 'example.com.' , 'class' : 'IN' , 'type' : 'A' , 'ttl' : 29658 , 'data' :
'93.184.216.34' }]
Untuk dokumentasi paket
jc
Python, gunakanhelp('jc')
,help('jc.lib')
, atau lihat dokumentasi online.
Tersedia dua representasi data. Representasi default menggunakan skema ketat per parser dan mengonversi angka yang diketahui menjadi nilai JSON int/float. Nilai-nilai tertentu yang diketahui dari None
dikonversi ke JSON null
, nilai-nilai boolean yang diketahui dikonversi, dan, dalam beberapa kasus, bidang konteks semantik tambahan ditambahkan.
Untuk mengakses JSON mentah yang telah diproses sebelumnya, gunakan opsi -r
cli atau parameter fungsi raw=True
di parse()
saat menggunakan jc
sebagai pustaka python.
Skema untuk setiap parser dapat ditemukan di link dokumentasi di samping masing-masing Parser di bawah.
Catatan rilis dapat ditemukan di bagian Rilis di Github.
Untuk informasi lebih lanjut mengenai motivasi proyek ini, silakan lihat postingan blog saya tentang Membawa Filsafat Unix ke Abad 21 dan wawancara saya dengan Console.
Lihat juga:
Kasus Penggunaan:
Ada beberapa cara untuk mendapatkan jc
. Anda dapat menginstal melalui pip
, repositori paket OS, atau dengan mengunduh biner yang benar untuk arsitektur Anda dan menjalankannya di mana saja di sistem file Anda.
pip3 install jc
sistem operasi | Memerintah |
---|---|
Linux Debian/Ubuntu | apt-get install jc |
Fedora linux | dnf install jc |
openSUSE linux | zypper install jc |
Linux lengkung | pacman -S jc |
NixOS linux | nix-env -iA nixpkgs.jc atau nix-env -iA nixos.jc |
Linux Sistem Guix | guix install jc |
Gentoo Linux | emerge dev-python/jc |
Foton linux | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Plugin filter yang memungkinkan | ansible-galaxy collection install community.general |
Konektor FortiSOAR | Instal dari FortiSOAR Connector Marketplace |
Untuk Paket OS selengkapnya, lihat https://repology.org/project/jc/versions.
Untuk biner yang telah dikompilasi sebelumnya, lihat Rilis di Github.
jc
menerima masukan yang disalurkan dari STDIN
dan mengeluarkan representasi JSON dari keluaran perintah sebelumnya ke STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternatifnya, sintaks "ajaib" dapat digunakan dengan menambahkan jc
ke perintah yang akan dikonversi atau di depan jalur absolut untuk file Proc. Opsi dapat diteruskan ke jc
segera sebelum perintah atau jalur file Proc diberikan. (Catatan: alias perintah dan bawaan shell tidak didukung)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
Output JSON bisa ringkas (default) atau diformat cantik dengan opsi -p
.
Argumen | Perintah atau Tipe File | Dokumentasi |
---|---|---|
--acpi | pengurai perintah acpi | detail |
--airport | airport -I memerintahkan parser | detail |
--airport-s | pengurai perintah airport -s | detail |
--apt-cache-show | apt-cache show pengurai perintah | detail |
--apt-get-sqq | pengurai perintah apt-get -sqq | detail |
--arp | pengurai perintah arp | detail |
--asciitable | Pengurai tabel ASCII dan Unicode | detail |
--asciitable-m | pengurai tabel ASCII dan Unicode multi-baris | detail |
--blkid | pengurai perintah blkid | detail |
--bluetoothctl | pengurai perintah bluetoothctl | detail |
--cbt | pengurai perintah cbt (Google Bigtable). | detail |
--cef | pengurai string CEF | detail |
--cef-s | Pengurai streaming string CEF | detail |
--certbot | pengurai perintah certbot | detail |
--chage | chage --list pengurai perintah | detail |
--cksum | pengurai perintah cksum dan sum | detail |
--clf | Pengurai file Format Log Umum dan Gabungan | detail |
--clf-s | Parser streaming file Format Log Umum dan Gabungan | detail |
--crontab | perintah crontab dan pengurai file | detail |
--crontab-u | pengurai file crontab dengan dukungan pengguna | detail |
--csv | Pengurai file CSV | detail |
--csv-s | Pengurai streaming file CSV | detail |
--curl-head | curl --head pengurai perintah | detail |
--date | pengurai perintah date | detail |
--datetime-iso | Pengurai string tanggal dan waktu ISO 8601 | detail |
--debconf-show | debconf-show pengurai perintah | detail |
--df | pengurai perintah df | detail |
--dig | dig parser perintah | detail |
--dir | pengurai perintah dir | detail |
--dmidecode | pengurai perintah dmidecode | detail |
--dpkg-l | dpkg -l pengurai perintah | detail |
--du | du pengurai perintah | detail |
--efibootmgr | pengurai perintah efibootmgr | detail |
--email-address | Pengurai string Alamat Email | detail |
--env | pengurai perintah env | detail |
--ethtool | pengurai perintah ethtool | detail |
--file | pengurai perintah file | detail |
--find | find pengurai perintah | detail |
--findmnt | findmnt pengurai perintah | detail |
--finger | parser perintah finger | detail |
--free | parser perintah free | detail |
--fstab | /etc/fstab pengurai file | detail |
--git-log | pengurai perintah git log | detail |
--git-log-s | pengurai streaming perintah git log | detail |
--git-ls-remote | git ls-remote | detail |
--gpg | pengurai perintah gpg --with-colons | detail |
--group | /etc/group pengurai file | detail |
--gshadow | /etc/gshadow pengurai file | detail |
--hash | pengurai perintah hash | detail |
--hashsum | pengurai perintah hashsum ( md5sum , shasum , dll.) | detail |
--hciconfig | pengurai perintah hciconfig | detail |
--history | parser perintah history | detail |
--host | pengurai perintah host | detail |
--hosts | /etc/hosts file | detail |
--http-headers | Pengurai header HTTP | detail |
--id | pengurai perintah id | detail |
--ifconfig | pengurai perintah ifconfig | detail |
--ini | pengurai file INI | detail |
--ini-dup | INI dengan pengurai file kunci duplikat | detail |
--iostat | pengurai perintah iostat | detail |
--iostat-s | pengurai streaming perintah iostat | detail |
--ip-address | Pengurai string alamat IPv4 dan IPv6 | detail |
--ipconfig | ipconfig pengurai perintah Windows | detail |
--iptables | pengurai perintah iptables | detail |
--ip-route | pengurai perintah ip route | detail |
--iw-scan | iw dev [device] scan perintah parser | detail |
--iwconfig | pengurai perintah iwconfig | detail |
--jar-manifest | Pengurai file Java MANIFEST.MF | detail |
--jobs | pengurai perintah jobs | detail |
--jwt | Pengurai string JWT | detail |
--kv | File kunci/nilai dan pengurai string | detail |
--kv-dup | Kunci/Nilai dengan file kunci duplikat dan pengurai string | detail |
--last | parser perintah last dan lastb | detail |
--ls | ls pengurai perintah | detail |
--ls-s | ls pengurai streaming perintah | detail |
--lsattr | pengurai perintah lsattr | detail |
--lsb-release | pengurai perintah lsb_release | detail |
--lsblk | pengurai perintah lsblk | detail |
--lsmod | pengurai perintah lsmod | detail |
--lsof | lsof pengurai perintah | detail |
--lspci | lspci -mmv | detail |
--lsusb | pengurai perintah lsusb | detail |
--m3u | Pengurai file M3U dan M3U8 | detail |
--mdadm | pengurai perintah mdadm | detail |
--mount | mount parser perintah | detail |
--mpstat | pengurai perintah mpstat | detail |
--mpstat-s | pengurai streaming perintah mpstat | detail |
--needrestart | needrestart -b pengurai perintah | detail |
--netstat | pengurai perintah netstat | detail |
--nmcli | pengurai perintah nmcli | detail |
--nsd-control | pengurai perintah nsd-control | detail |
--ntpq | ntpq -p pengurai perintah | detail |
--openvpn | pengurai file openvpn-status.log | detail |
--os-prober | pengurai perintah os-prober | detail |
--os-release | /etc/os-release pengurai file | detail |
--pacman | pengurai perintah pacman | detail |
--passwd | /etc/passwd file | detail |
--path | Pengurai string jalur POSIX | detail |
--path-list | Pengurai string daftar jalur POSIX | detail |
--pci-ids | pengurai file pci.ids | detail |
--pgpass | Pengurai file kata sandi PostgreSQL | detail |
--pidstat | pidstat -H pengurai perintah | detail |
--pidstat-s | pidstat -H pengurai streaming perintah | detail |
--ping | pengurai perintah ping dan ping6 | detail |
--ping-s | pengurai streaming perintah ping dan ping6 | detail |
--pip-list | pengurai perintah pip list | detail |
--pip-show | pip show pengurai perintah | detail |
--pkg-index-apk | Pengurai file Indeks Paket Alpine Linux | detail |
--pkg-index-deb | Pengurai file Indeks Paket Debian | detail |
--plist | Pengurai file PLIST | detail |
--postconf | postconf -M pengurai perintah | detail |
--proc | /proc/ pengurai file | detail |
--ps | pengurai perintah ps | detail |
--resolve-conf | /etc/resolve.conf pengurai file | detail |
--route | pengurai perintah route | detail |
--rpm-qi | rpm -qi | detail |
--rsync | pengurai perintah rsync | detail |
--rsync-s | pengurai streaming perintah rsync | detail |
--semver | Pengurai string Versi Semantik | detail |
--sfdisk | pengurai perintah sfdisk | detail |
--shadow | /etc/shadow | detail |
--srt | Pengurai file SRT | detail |
--ss | pengurai perintah ss | detail |
--ssh-conf | file konfigurasi ssh dan parser perintah ssh -G | detail |
--sshd-conf | file konfigurasi sshd dan parser perintah sshd -T | detail |
--stat | pengurai perintah stat | detail |
--stat-s | pengurai streaming perintah stat | detail |
--swapon | pengurai perintah swapon | detail |
--sysctl | pengurai perintah sysctl | detail |
--syslog | Pengurai string Syslog RFC 5424 | detail |
--syslog-s | Pengurai streaming string Syslog RFC 5424 | detail |
--syslog-bsd | Pengurai string Syslog RFC 3164 | detail |
--syslog-bsd-s | Pengurai streaming string Syslog RFC 3164 | detail |
--systemctl | pengurai perintah systemctl | detail |
--systemctl-lj | pengurai perintah systemctl list-jobs | detail |
--systemctl-ls | pengurai perintah systemctl list-sockets | detail |
--systemctl-luf | pengurai perintah systemctl list-unit-files | detail |
--systeminfo | pengurai perintah systeminfo | detail |
--time | /usr/bin/time | detail |
--timedatectl | pengurai perintah timedatectl status | detail |
--timestamp | Pengurai string Stempel Waktu Epoch Unix | detail |
--toml | Pengurai file TOML | detail |
--top | pengurai perintah top -b | detail |
--top-s | pengurai streaming perintah top -b | detail |
--tracepath | pengurai perintah tracepath dan tracepath6 | detail |
--traceroute | pengurai perintah traceroute dan traceroute6 | detail |
--tune2fs | tune2fs -l pengurai perintah | detail |
--udevadm | pengurai perintah udevadm info | detail |
--ufw | pengurai perintah ufw status | detail |
--ufw-appinfo | ufw app info [application] pengurai perintah | detail |
--uname | uname -a -pengurai perintah | detail |
--update-alt-gs | update-alternatives --get-selections pengurai perintah | detail |
--update-alt-q | update-alternatives --query pengurai perintah | detail |
--upower | pengurai perintah upower | detail |
--uptime | pengurai perintah uptime | detail |
--url | Pengurai string URL | detail |
--ver | Pengurai string versi | detail |
--veracrypt | pengurai perintah veracrypt | detail |
--vmstat | pengurai perintah vmstat | detail |
--vmstat-s | pengurai streaming perintah vmstat | detail |
--w | w pengurai perintah | detail |
--wc | pengurai perintah wc | detail |
--wg-show | wg show pengurai perintah | detail |
--who | who yang memerintahkan parser | detail |
--x509-cert | Pengurai file sertifikat PEM dan DER X.509 | detail |
--x509-csr | Pengurai file permintaan sertifikat PEM dan DER X.509 | detail |
--xml | Pengurai file XML | detail |
--xrandr | pengurai perintah xrandr | detail |
--yaml | Pengurai file YAML | detail |
--zipinfo | pengurai perintah zipinfo | detail |
--zpool-iostat | pengurai perintah zpool iostat | detail |
--zpool-status | pengurai perintah zpool status | detail |
Pendek | Panjang | Keterangan |
---|---|---|
-a | --about | Tentang jc . Mencetak informasi tentang jc dan parser (tentu saja dalam JSON atau YAML!) |
-C | --force-color | Memaksa keluaran warna bahkan saat menggunakan pipa (mengganti -m dan variabel env NO_COLOR ) |
-d | --debug | Modus debug. Mencetak pesan jejak jika terjadi masalah penguraian (gunakan -dd untuk debugging verbose) |
-h | --help | Membantu. Gunakan jc -h --parser_name untuk dokumentasi parser. Gunakan dua kali untuk menampilkan parser tersembunyi (misalnya -hh ). Gunakan tiga kali untuk menampilkan kategori parser (misalnya -hhh ). |
-m | --monochrome | Keluaran monokrom |
-M | --meta-out | Tambahkan metadata ke output termasuk stempel waktu, nama parser, perintah ajaib, kode keluar perintah ajaib, dll. |
-p | --pretty | Format cantik output JSON |
-q | --quiet | Modus senyap. Menekan pesan peringatan parser (gunakan -qq untuk mengabaikan kesalahan parser streaming) |
-r | --raw | Keluaran mentah. Memberikan keluaran yang lebih literal, biasanya dengan nilai string dan tanpa pemrosesan semantik tambahan |
-s | --slurp | Menyeruput beberapa baris ke dalam array. (gunakan -hhh untuk menemukan parser yang kompatibel) |
-u | --unbuffer | Buka buffer keluaran |
-v | --version | Informasi versi |
-y | --yaml-out | keluaran YAML |
-B | --bash-comp | Hasilkan skrip penyelesaian Bash Shell (info lebih lanjut) |
-Z | --zsh-comp | Hasilkan skrip penyelesaian shell Zsh (info lebih lanjut) |
Pemotongan garis didukung menggunakan sintaks START:STOP
yang mirip dengan pemotongan Python. Ini memungkinkan Anda untuk melewati baris di awal dan/atau akhir input STDIN
yang ingin Anda jc
.
START
dan STOP
dapat berupa bilangan bulat positif atau negatif atau kosong dan memungkinkan Anda menentukan berapa banyak baris yang akan dilewati dan berapa banyak baris yang akan diproses. Irisan positif dan kosong adalah yang paling hemat memori. Bilangan bulat negatif apa pun dalam irisan akan menggunakan lebih banyak memori.
Misalnya, untuk melewati baris pertama dan terakhir teks berikut, Anda dapat mengekspresikan potongan tersebut dalam beberapa cara:
$ cat table.txt
# ## We want to skip this header ###
col1 col2
foo 1
bar 2
# ## We want to skip this footer ###
$ cat table.txt | jc 1:-1 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
$ cat table.txt | jc 1:4 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
Dalam contoh ini potongan garis 1:-1
dan 1:4
memberikan keluaran yang sama.
Bila menggunakan bilangan bulat positif, lokasi indeks STOP
bersifat non-inklusif. Irisan positif dihitung dari baris pertama masukan hingga akhir dimulai dari 0
sebagai baris pertama. Irisan negatif dihitung dari baris terakhir hingga awal, dimulai dari -1
sebagai baris terakhir. Ini juga cara kerja fitur slicing Python.
Berikut adalah rincian opsi potongan garis:
Notasi Irisan | Jalur Masukan Diproses |
---|---|
START:STOP | jalur START hingga STOP - 1 |
START: | garis START melalui sisa output |
:STOP | garis dari awal sampai STOP - 1 |
-START:STOP | Garis START dari akhir sampai STOP - 1 |
START:-STOP | garis START sampai garis STOP dari akhir |
-START:-STOP | Garis START dari akhir hingga garis STOP dari akhir |
-START: | Garis START dari akhir hingga sisa keluaran |
:-STOP | garis dari awal sampai garis STOP dari akhir |
: | semua lini |
Beberapa parser mendukung masukan multi-item dan dapat mengeluarkan serangkaian hasil dalam sekali jalan. Menyeruput berfungsi untuk parser string yang menerima satu baris input. (misalnya url
dan ip-address
) Untuk melihat daftar parser yang mendukung opsi --slurp
, gunakan jc -hhh
.
Misalnya, Anda dapat mengirim file dengan beberapa alamat IP (satu per baris) ke jc
dengan opsi --slurp
dan serangkaian hasil akan ditampilkan:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
Sintaks ajaib untuk file /proc
secara otomatis mendukung penyedotan banyak file (tidak perlu menggunakan opsi --slurp
). Misalnya, Anda dapat mengonversi banyak file PID sekaligus:
$ jc /proc/ * /status
[ < multiple output objects > ]
Ketika sintaks ajaib /proc
digunakan dan beberapa file dipilih, kolom _file
tambahan dimasukkan ke dalam output sehingga lebih mudah untuk mengetahui file apa yang dirujuk oleh setiap objek output.
Terakhir, opsi --meta-out
dapat digunakan bersama dengan keluaran yang dihirup. Dalam hal ini, keluaran yang dihirup dibungkus dalam objek dengan struktur berikut:
{
"result" : [ ],
"_jc_meta" : {
"parser" : " url " ,
"timestamp" : 1706235558.654576 ,
"slice_start" : null ,
"slice_end" : null ,
"input_list" : [
" http://www.google.com " ,
" https://www.apple.com " ,
" https://www.microsoft.com "
]
}
}
Dengan --meta-out
, input_list
berisi daftar input (string input aktual atau nama file /proc
) sehingga Anda dapat mengidentifikasi objek output mana yang terkait dengan setiap string input atau nama file /proc
.
Kesalahan fatal apa pun dalam jc
akan menghasilkan kode keluar 100
, jika tidak, kode keluarnya adalah 0
.
Saat menggunakan sintaks "ajaib" (misalnya jc ifconfig eth0
), jc
akan menyimpan kode keluar dari program yang sedang diurai dan menambahkannya ke kode keluar jc
. Dengan cara ini lebih mudah untuk menentukan apakah kesalahan berasal dari program yang diurai atau jc
.
Perhatikan contoh berikut menggunakan ifconfig
:
kode keluar ifconfig | kode keluar jc | Kode keluar gabungan | Interpretasi |
---|---|---|---|
0 | 0 | 0 | Tidak ada kesalahan |
1 | 0 | 1 | Kesalahan di ifconfig |
0 | 100 | 100 | Kesalahan di jc |
1 | 100 | 101 | Kesalahan di ifconfig dan jc |
Saat menggunakan sintaks "ajaib" Anda juga dapat mengambil kode keluar dari program yang dipanggil dengan menggunakan opsi --meta-out
atau -M
. Ini akan menambahkan objek _jc_meta
ke output yang akan menyertakan informasi perintah ajaib, termasuk kode keluar.
Berikut ini contoh dengan ping
:
$ jc --meta-out -p ping -c2 192.168.1.252
{
" destination_ip " : " 192.168.1.252 " ,
" data_bytes " : 56,
" pattern " : null,
" destination " : " 192.168.1.252 " ,
" packets_transmitted " : 2,
" packets_received " : 0,
" packet_loss_percent " : 100.0,
" duplicates " : 0,
" responses " : [
{
" type " : " timeout " ,
" icmp_seq " : 0,
" duplicate " : false
}
],
" _jc_meta " : {
" parser " : " ping " ,
" timestamp " : 1661357115.27949,
" magic_command " : [
" ping " ,
" -c2 " ,
" 192.168.1.252 "
],
" magic_command_exit " : 2
}
}
$ echo $?
2
Anda dapat menentukan warna khusus melalui variabel lingkungan JC_COLORS
. Variabel lingkungan JC_COLORS
mengambil empat nilai string yang dipisahkan koma dalam format berikut:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Dimana warnanya: black
, red
, green
, yellow
, blue
, magenta
, cyan
, gray
, brightblack
, brightred
, brightgreen
, brightyellow
, brightblue
, brightmagenta
, brightcyan
, white
, atau default
Misalnya, untuk menyetel ke warna default:
JC_COLORS=blue,brightblack,magenta,green
atau
JC_COLORS=default,default,default,default
Anda dapat mengatur variabel lingkungan NO_COLOR
ke nilai apa pun untuk menonaktifkan keluaran warna di jc
. Perhatikan bahwa menggunakan opsi -C
untuk memaksa keluaran warna akan menggantikan variabel lingkungan NO_COLOR
dan opsi -m
.
Kebanyakan parser memuat semua data dari STDIN
, menguraikannya, lalu mengeluarkan seluruh dokumen JSON secara serial. Ada beberapa pengurai streaming (misalnya ls-s
dan ping-s
) yang segera mulai memproses dan mengeluarkan data baris demi baris sebagai Garis JSON (alias NDJSON) saat sedang diterima dari STDIN
. Hal ini dapat secara signifikan mengurangi jumlah memori yang diperlukan untuk mengurai output perintah dalam jumlah besar (misalnya ls -lR /
) dan terkadang dapat memproses data dengan lebih cepat. Parser streaming memiliki perilaku yang sedikit berbeda dari parser standar seperti diuraikan di bawah.
Catatan: Parser streaming tidak dapat digunakan dengan sintaks "ajaib".
Anda mungkin ingin mengabaikan kesalahan penguraian saat menggunakan parser streaming karena ini mungkin digunakan dalam alur pemrosesan yang berumur panjang dan kesalahan dapat merusak saluran. Untuk mengabaikan kesalahan penguraian, gunakan opsi -qq
cli atau argumen ignore_exceptions=True
dengan fungsi parse()
. Ini akan menambahkan objek _jc_meta
ke output JSON dengan atribut success
. Jika success
itu true
, maka tidak ada masalah dalam penguraian garis. Jika success
adalah false
, maka masalah penguraian ditemukan dan kolom error
dan line
akan ditambahkan untuk menyertakan deskripsi singkat error dan konten baris yang tidak dapat diurai:
Berhasil menguraikan baris dengan opsi -qq
:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Baris yang gagal diurai dengan opsi -qq
:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
Sebagian besar sistem operasi akan melakukan buffer output yang disalurkan dari proses ke proses. Buffer biasanya sekitar 4KB. Saat melihat output di terminal, buffer OS tidak diaktifkan sehingga output segera ditampilkan di layar. Namun, ketika menyalurkan beberapa proses secara bersamaan, keluarannya mungkin terlihat terhenti ketika data masukan sangat lambat (misalnya ping
):
$ ping 1.1.1.1 | jc --ping-s | jq
Hal ini karena OS menggunakan buffer 4KB antara jc
dan jq
dalam contoh ini. Untuk menampilkan data di terminal secara realtime, Anda dapat menonaktifkan buffer dengan opsi -u
(unbuffer) cli:
$ ping 1.1.1.1 | jc --ping-s -u | jq
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
...
Catatan: Output tanpa buffer bisa lebih lambat untuk aliran data besar.
Pengurai streaming menerima objek apa pun yang dapat diubah dan mengembalikan objek yang dapat diubah yang memungkinkan pemrosesan data yang lambat. Data masukan harus diulang pada baris data string. Contoh data masukan yang baik adalah sys.stdin
atau str.splitlines()
.
Untuk menggunakan objek iterable yang dikembalikan dalam kode Anda, cukup ulangi objek tersebut atau gunakan fungsi bawaan next():
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Plugin parser dapat ditempatkan di folder jc/jcparsers
di "Direktori data aplikasi" lokal Anda:
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Plugin parser adalah file modul python standar. Gunakan parser jc/parsers/foo.py
atau jc/parsers/foo_s.py (streaming)
sebagai templat dan cukup letakkan file .py
di subfolder jcparsers
. Dependensi apa pun dapat ditempatkan di folder jc
di atas jcparsers
dan dapat diimpor dalam kode parser.
Nama file plugin parser harus berupa nama modul python yang valid dan oleh karena itu harus dimulai dengan huruf dan seluruhnya terdiri dari alfanumerik dan garis bawah. Plugin lokal mungkin mengesampingkan parser default.
Catatan: Direktori data aplikasi mengikuti Spesifikasi Direktori Dasar XDG
Untuk hasil terbaik, atur variabel lingkungan lokal ke C
atau en_US.UTF-8
dengan memodifikasi variabel LC_ALL
:
$ LC_ALL=C date | jc --date
Anda juga dapat mengatur variabel lokal satu per satu:
$ export LANG=C
$ export LC_NUMERIC=C
Pada beberapa sistem lama, output UTF-8 akan diturunkan ke ASCII dengan urutan escape \u
jika lokal C
tidak mendukung pengkodean UTF-8.
Beberapa parser telah menghitung kolom stempel waktu Epoch yang ditambahkan ke output. Kecuali jika nama kolom stempel waktu memiliki akhiran _utc
maka nama tersebut dianggap naif. (yaitu berdasarkan zona waktu lokal dari sistem tempat parser jc
dijalankan).
Jika zona waktu UTC dapat dideteksi dalam teks keluaran perintah, stempel waktu akan mengetahui zona waktu dan memiliki akhiran _utc
pada nama kunci. (misalnya epoch_utc
) Tidak ada zona waktu lain yang didukung untuk stempel waktu yang diketahui.
jc
dapat digunakan di hampir semua shell. Beberapa shell modern memiliki deserialisasi JSON dan kemampuan pemfilteran bawaan yang membuat penggunaan jc
menjadi lebih nyaman.
Misalnya, hal berikut ini mungkin dilakukan di NGS (Next Generation Shell):
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
Ini menjalankan jc
, mem-parsing output JSON, dan menetapkan struktur data yang dihasilkan ke variabel dalam satu baris kode.
Untuk contoh lebih lanjut tentang cara menggunakan jc
di shell lain, lihat halaman wiki ini.
Beberapa parser seperti dig
, xml
, csv
, dll. akan berfungsi pada platform apa pun. Parser lain yang mengonversi keluaran spesifik platform akan menghasilkan pesan peringatan jika dijalankan pada platform yang tidak didukung. Untuk melihat semua informasi parser, termasuk kompatibilitas, jalankan jc -ap
.
Anda masih dapat menggunakan parser pada platform yang tidak didukung - misalnya, Anda mungkin ingin mengurai file dengan keluaran linux lsof
di laptop MacOS atau Windows. Dalam hal ini Anda dapat menyembunyikan pesan peringatan dengan opsi -q
cli atau parameter fungsi quiet=True
di parse()
:
macOS:
cat lsof.out | jc -q --lsof
atau jendela:
type lsof.out | jc -q --lsof
Diuji pada:
Jangan ragu untuk menambah/meningkatkan kode atau parser! Anda dapat menggunakan parser jc/parsers/foo.py
atau jc/parsers/foo_s.py (streaming)
sebagai templat dan mengirimkan parser Anda dengan permintaan tarik.
Silakan lihat Pedoman Berkontribusi untuk informasi lebih lanjut.
ifconfig-parser
oleh KnightWhoSayNixmltodict
oleh Martín Blechruamel.yaml
oleh Anthon van der Neuttrparse
oleh Luis Benitez Berikut adalah beberapa contoh keluaran jc
. Untuk contoh lebih lanjut, lihat di sini atau dokumentasi parser.
arp | jc -p --arp # or: jc -p arp
[
{
"address" : " gateway " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:f7:4a:fc " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.1 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:c0:00:08 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.254 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:fe:7a:b4 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
}
]
cat homes.csv
"Sell", "List", "Living", "Rooms", "Beds", "Baths", "Age", "Acres", "Taxes"
142, 160, 28, 10, 5, 3, 60, 0.28, 3167
175, 180, 18, 8, 4, 1, 12, 0.43, 4033
129, 132, 13, 6, 3, 1, 41, 0.33, 1471
...
cat homes.csv | jc -p --csv
[
{
"Sell" : " 142 " ,
"List" : " 160 " ,
"Living" : " 28 " ,
"Rooms" : " 10 " ,
"Beds" : " 5 " ,
"Baths" : " 3 " ,
"Age" : " 60 " ,
"Acres" : " 0.28 " ,
"Taxes" : " 3167 "
},
{
"Sell" : " 175 " ,
"List" : " 180 " ,
"Living" : " 18 " ,
"Rooms" : " 8 " ,
"Beds" : " 4 " ,
"Baths" : " 1 " ,
"Age" : " 12 " ,
"Acres" : " 0.43 " ,
"Taxes" : " 4033 "
},
{
"Sell" : " 129 " ,
"List" : " 132 " ,
"Living" : " 13 " ,
"Rooms" : " 6 " ,
"Beds" : " 3 " ,
"Baths" : " 1 " ,
"Age" : " 41 " ,
"Acres" : " 0.33 " ,
"Taxes" : " 1471 "
}
]
cat /etc/hosts | jc -p --hosts
[
{
"ip" : " 127.0.0.1 " ,
"hostname" : [
" localhost "
]
},
{
"ip" : " ::1 " ,
"hostname" : [
" ip6-localhost " ,
" ip6-loopback "
]
},
{
"ip" : " fe00::0 " ,
"hostname" : [
" ip6-localnet "
]
}
]
ifconfig | jc -p --ifconfig # or: jc -p ifconfig
[
{
"name" : " ens33 " ,
"flags" : 4163 ,
"state" : [
" UP " ,
" BROADCAST " ,
" RUNNING " ,
" MULTICAST "
],
"mtu" : 1500 ,
"ipv4_addr" : " 192.168.71.137 " ,
"ipv4_mask" : " 255.255.255.0 " ,
"ipv4_bcast" : " 192.168.71.255 " ,
"ipv6_addr" : " fe80::c1cb:715d:bc3e:b8a0 " ,
"ipv6_mask" : 64 ,
"ipv6_scope" : " 0x20 " ,
"mac_addr" : " 00:0c:29:3b:58:0e " ,
"type" : " Ethernet " ,
"rx_packets" : 8061 ,
"rx_bytes" : 1514413 ,
"rx_errors" : 0 ,
"rx_dropped" : 0 ,
"rx_overruns" : 0 ,
"rx_frame" : 0 ,
"tx_packets" : 4502 ,
"tx_bytes" : 866622 ,
"tx_errors" : 0 ,
"tx_dropped" : 0 ,
"tx_overruns" : 0 ,
"tx_carrier" : 0 ,
"tx_collisions" : 0 ,
"metric" : null
}
]
cat example.ini
foo = fiz
bar = buz
[section1]
fruit = apple
color = blue
[section2]
fruit = pear
color = green
cat example.ini | jc -p --ini
{
"foo" : " fiz " ,
"bar" : " buz " ,
"section1" : {
"fruit" : " apple " ,
"color" : " blue "
},
"section2" : {
"fruit" : " pear " ,
"color" : " green "
}
}
$ ls -l /usr/bin | jc -p --ls # or: jc -p ls -l /usr/bin
[
{
"filename" : " apropos " ,
"link_to" : " whatis " ,
"flags" : " lrwxrwxrwx. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 6 ,
"date" : " Aug 15 10:53 "
},
{
"filename" : " ar " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 62744 ,
"date" : " Aug 8 16:14 "
},
{
"filename" : " arch " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 33080 ,
"date" : " Aug 19 23:25 "
}
]
netstat -apee | jc -p --netstat # or: jc -p netstat -apee
[
{
"proto" : " tcp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : " LISTEN " ,
"user" : " systemd-resolve " ,
"inode" : 26958 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " tcp6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " LISTEN " ,
"user" : " root " ,
"inode" : 30510 ,
"program_name" : " sshd " ,
"kind" : " network " ,
"pid" : 1186 ,
"local_port" : " ssh " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv6 "
},
{
"proto" : " udp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : null ,
"user" : " systemd-resolve " ,
"inode" : 26957 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " udp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " raw6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " 7 " ,
"user" : " systemd-network " ,
"inode" : 27001 ,
"program_name" : " systemd-network " ,
"kind" : " network " ,
"pid" : 867 ,
"local_port" : " ipv6-icmp " ,
"foreign_port" : " * " ,
"transport_protocol" : null ,
"network_protocol" : " ipv6 "
},
{
"proto" : " unix " ,
"refcnt" : 2 ,
"flags" : null ,
"type" : " DGRAM " ,
"state" : null ,
"inode" : 33322 ,
"program_name" : " systemd " ,
"path" : " /run/user/1000/systemd/notify " ,
"kind" : " socket " ,
"pid" : 1607
}
]
cat /etc/passwd | jc -p --passwd
[
{
"username" : " root " ,
"password" : " * " ,
"uid" : 0 ,
"gid" : 0 ,
"comment" : " System Administrator " ,
"home" : " /var/root " ,
"shell" : " /bin/sh "
},
{
"username" : " daemon " ,
"password" : " * " ,
"uid" : 1 ,
"gid" : 1 ,
"comment" : " System Services " ,
"home" : " /var/root " ,
"shell" : " /usr/bin/false "
}
]
ping 8.8.8.8 -c 3 | jc -p --ping # or: jc -p ping 8.8.8.8 -c 3
{
"destination_ip" : " 8.8.8.8 " ,
"data_bytes" : 56 ,
"pattern" : null ,
"destination" : " 8.8.8.8 " ,
"packets_transmitted" : 3 ,
"packets_received" : 3 ,
"packet_loss_percent" : 0.0 ,
"duplicates" : 0 ,
"time_ms" : 2005.0 ,
"round_trip_ms_min" : 23.835 ,
"round_trip_ms_avg" : 30.46 ,
"round_trip_ms_max" : 34.838 ,
"round_trip_ms_stddev" : 4.766 ,
"responses" : [
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 1 ,
"ttl" : 118 ,
"time_ms" : 23.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 2 ,
"ttl" : 118 ,
"time_ms" : 34.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 3 ,
"ttl" : 118 ,
"time_ms" : 32.7 ,
"duplicate" : false
}
]
}
ps axu | jc -p --ps # or: jc -p ps axu
[
{
"user" : " root " ,
"pid" : 1 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.1 ,
"vsz" : 128072 ,
"rss" : 6784 ,
"tty" : null ,
"stat" : " Ss " ,
"start" : " Nov09 " ,
"time" : " 0:08 " ,
"command" : " /usr/lib/systemd/systemd --switched-root --system --deseria... "
},
{
"user" : " root " ,
"pid" : 2 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kthreadd] "
},
{
"user" : " root " ,
"pid" : 4 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S< " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kworker/0:0H] "
}
]
traceroute -m 2 8.8.8.8 | jc -p --traceroute
# or: jc -p traceroute -m 2 8.8.8.8
{
"destination_ip" : " 8.8.8.8 " ,
"destination_name" : " 8.8.8.8 " ,
"hops" : [
{
"hop" : 1 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.616
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.413
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.308
}
]
},
{
"hop" : 2 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.367
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 40.197
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.162
}
]
}
]
}
uptime | jc -p --uptime # or: jc -p uptime
{
"time" : " 11:35 " ,
"uptime" : " 3 days, 4:03 " ,
"users" : 5 ,
"load_1m" : 1.88 ,
"load_5m" : 2.0 ,
"load_15m" : 1.94 ,
"time_hour" : 11 ,
"time_minute" : 35 ,
"time_second" : null ,
"uptime_days" : 3 ,
"uptime_hours" : 4 ,
"uptime_minutes" : 3 ,
"uptime_total_seconds" : 273780
}
cat cd_catalog.xml
xml version = " 1.0 " encoding = " UTF-8 " ?> < CATALOG > < CD > < TITLE >Empire Burlesque TITLE > < ARTIST >Bob Dylan ARTIST > < COUNTRY >USA COUNTRY > < COMPANY >Columbia COMPANY > < PRICE >10.90 PRICE > < YEAR >1985 YEAR > CD > < CD > < TITLE >Hide your heart TITLE > < ARTIST >Bonnie Tyler ARTIST > < COUNTRY >UK COUNTRY > < COMPANY >CBS Records COMPANY > < PRICE >9.90 PRICE > < YEAR >1988 YEAR > CD > ...
cat cd_catalog.xml | jc -p --xml
{
"CATALOG" : {
"CD" : [
{
"TITLE" : " Empire Burlesque " ,
"ARTIST" : " Bob Dylan " ,
"COUNTRY" : " USA " ,
"COMPANY" : " Columbia " ,
"PRICE" : " 10.90 " ,
"YEAR" : " 1985 "
},
{
"TITLE" : " Hide your heart " ,
"ARTIST" : " Bonnie Tyler " ,
"COUNTRY" : " UK " ,
"COMPANY" : " CBS Records " ,
"PRICE" : " 9.90 " ,
"YEAR" : " 1988 "
}
]
}
}
cat istio.yaml
apiVersion : " authentication.istio.io/v1alpha1 "
kind : " Policy "
metadata :
name : " default "
namespace : " default "
spec :
peers :
- mtls : {}
---
apiVersion : " networking.istio.io/v1alpha3 "
kind : " DestinationRule "
metadata :
name : " default "
namespace : " default "
spec :
host : " *.default.svc.cluster.local "
trafficPolicy :
tls :
mode : ISTIO_MUTUAL
cat istio.yaml | jc -p --yaml
[
{
"apiVersion" : " authentication.istio.io/v1alpha1 " ,
"kind" : " Policy " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"peers" : [
{
"mtls" : {}
}
]
}
},
{
"apiVersion" : " networking.istio.io/v1alpha3 " ,
"kind" : " DestinationRule " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"host" : " *.default.svc.cluster.local " ,
"trafficPolicy" : {
"tls" : {
"mode" : " ISTIO_MUTUAL "
}
}
}
}
]
© 2019-2024 Kelly Brasil