查看面向開發人員的
jc
Python 套件文檔
嘗試
jc
Web 演示和 REST API
jc
在community.general
集合中作為 Ansible 過濾器插件提供。請參閱此部落格文章的範例。
JSON 轉換
jc
對許多 CLI 工具、檔案類型和常見字串的輸出進行 JSON 化,以便在腳本中更輕鬆地進行解析。有關支援的命令、檔案類型和字串,請參閱解析器部分。
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 }]
這允許透過管道命令使用jq
或jello
等工具對輸出進行進一步的命令列處理:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
或使用替代的“魔法”語法:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
也可以用作 python 函式庫。在這種情況下,傳回的值將是一個 python 字典、一個字典列表,甚至是字典的惰性迭代而不是 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' }]
對於
jc
Python 套件文檔,請使用help('jc')
、help('jc.lib')
或查看線上文檔。
數據有兩種表示形式。預設表示形式對每個解析器使用嚴格的架構,並將已知數字轉換為 int/float JSON 值。 None
的某些已知值會轉換為 JSON null
,轉換已知的布林值,並且在某些情況下,會添加其他語義上下文欄位。
若要存取原始的、預先處理的 JSON,請在使用jc
作為 python 函式庫時使用-r
cli 選項或parse()
中的raw=True
函數參數。
每個解析器的模式可以在下面每個解析器旁邊的文檔連結中找到。
發行說明可以在 Github 的發行版部分找到。
有關此項目動機的更多信息,請參閱我的部落格文章「將 Unix 哲學帶入 21 世紀」以及我對 Console 的採訪。
參見:
使用案例:
有多種方法可以獲得jc
。您可以透過pip
、作業系統套件儲存庫進行安裝,或下載適合您的架構的正確二進位檔案並在檔案系統上的任何位置運行它。
pip3 install jc
作業系統 | 命令 |
---|---|
Debian/Ubuntu Linux | apt-get install jc |
費多拉Linux | dnf install jc |
開放SUSE Linux | zypper install jc |
拱門Linux | pacman -S jc |
尼克斯作業系統 | nix-env -iA nixpkgs.jc 或nix-env -iA nixos.jc |
linux 系統 | guix install jc |
Gentoo Linux | emerge dev-python/jc |
光子Linux | tdnf install jc |
macOS | brew install jc |
自由BSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Ansible 過濾器插件 | ansible-galaxy collection install community.general |
FortiSOAR 連接器 | 從 FortiSOAR 連接器市場安裝 |
有關更多作業系統軟體包,請參閱 https://repology.org/project/jc/versions。
對於預編譯的二進位文件,請參閱 Github 上的版本。
jc
接受來自STDIN
的管道輸入,並將上一個指令的輸出的 JSON 表示形式輸出到STDOUT
。
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
或者,可以透過在要轉換的命令前面或 Proc 檔案的絕對路徑前面新增jc
來使用「魔術」語法。選項可以在給予指令或 Proc 檔案路徑之前立即傳遞給jc
。 (注意:不支援指令別名和 shell 內建指令)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
JSON 輸出可以是緊湊的(預設),也可以使用-p
選項進行漂亮的格式化。
爭論 | 命令或文件類型 | 文件 |
---|---|---|
--acpi | acpi 命令解析器 | 細節 |
--airport | airport -I 命令解析器 | 細節 |
--airport-s | airport -s 命令解析器 | 細節 |
--apt-cache-show | apt-cache show 指令解析器 | 細節 |
--apt-get-sqq | apt-get -sqq 指令解析器 | 細節 |
--arp | arp 命令解析器 | 細節 |
--asciitable | ASCII 和 Unicode 表解析器 | 細節 |
--asciitable-m | 多行 ASCII 和 Unicode 表解析器 | 細節 |
--blkid | blkid 指令解析器 | 細節 |
--bluetoothctl | bluetoothctl 命令解析器 | 細節 |
--cbt | cbt (Google Bigtable) 指令解析器 | 細節 |
--cef | CEF 字串解析器 | 細節 |
--cef-s | CEF 字串流解析器 | 細節 |
--certbot | certbot 指令解析器 | 細節 |
--chage | chage --list 指令解析器 | 細節 |
--cksum | cksum 和sum 命令解析器 | 細節 |
--clf | 通用和組合日誌格式文件解析器 | 細節 |
--clf-s | 通用和組合日誌格式檔案流解析器 | 細節 |
--crontab | crontab 指令與檔案解析器 | 細節 |
--crontab-u | 具有使用者支援的crontab 檔案解析器 | 細節 |
--csv | CSV 檔案解析器 | 細節 |
--csv-s | CSV 檔案流解析器 | 細節 |
--curl-head | curl --head 指令解析器 | 細節 |
--date | date 命令解析器 | 細節 |
--datetime-iso | ISO 8601 日期時間字串解析器 | 細節 |
--debconf-show | debconf-show 指令解析器 | 細節 |
--df | df 命令解析器 | 細節 |
--dig | dig 命令解析器 | 細節 |
--dir | dir 命令解析器 | 細節 |
--dmidecode | dmidecode 命令解析器 | 細節 |
--dpkg-l | dpkg -l 命令解析器 | 細節 |
--du | du 指令解析器 | 細節 |
--efibootmgr | efibootmgr 命令解析器 | 細節 |
--email-address | 電子郵件地址字串解析器 | 細節 |
--env | env 命令解析器 | 細節 |
--ethtool | ethtool 命令解析器 | 細節 |
--file | file 命令解析器 | 細節 |
--find | find 命令解析器 | 細節 |
--findmnt | findmnt 命令解析器 | 細節 |
--finger | finger 命令解析器 | 細節 |
--free | free 命令解析器 | 細節 |
--fstab | /etc/fstab 檔案解析器 | 細節 |
--git-log | git log 指令解析器 | 細節 |
--git-log-s | git log 命令流解析器 | 細節 |
--git-ls-remote | git ls-remote 指令解析器 | 細節 |
--gpg | gpg --with-colons 指令解析器 | 細節 |
--group | /etc/group 檔案解析器 | 細節 |
--gshadow | /etc/gshadow 檔案解析器 | 細節 |
--hash | hash 命令解析器 | 細節 |
--hashsum | hashsum 指令解析器( md5sum 、 shasum 等) | 細節 |
--hciconfig | hciconfig 命令解析器 | 細節 |
--history | history 命令解析器 | 細節 |
--host | host 命令解析器 | 細節 |
--hosts | /etc/hosts 檔案解析器 | 細節 |
--http-headers | HTTP 標頭解析器 | 細節 |
--id | id 命令解析器 | 細節 |
--ifconfig | ifconfig 命令解析器 | 細節 |
--ini | INI 檔案解析器 | 細節 |
--ini-dup | 具有重複密鑰檔案解析器的 INI | 細節 |
--iostat | iostat 命令解析器 | 細節 |
--iostat-s | iostat 命令流解析器 | 細節 |
--ip-address | IPv4 和 IPv6 位址字串解析器 | 細節 |
--ipconfig | ipconfig Windows 命令解析器 | 細節 |
--iptables | iptables 命令解析器 | 細節 |
--ip-route | ip route 指令解析器 | 細節 |
--iw-scan | iw dev [device] scan 指令解析器 | 細節 |
--iwconfig | iwconfig 指令解析器 | 細節 |
--jar-manifest | Java MANIFEST.MF 檔案解析器 | 細節 |
--jobs | jobs 命令解析器 | 細節 |
--jwt | JWT 字串解析器 | 細節 |
--kv | 鍵/值檔案和字串解析器 | 細節 |
--kv-dup | 具有重複密鑰檔案和字串解析器的鍵/值 | 細節 |
--last | last 和lastb 命令解析器 | 細節 |
--ls | ls 指令解析器 | 細節 |
--ls-s | ls 命令流解析器 | 細節 |
--lsattr | lsattr 指令解析器 | 細節 |
--lsb-release | lsb_release 指令解析器 | 細節 |
--lsblk | lsblk 指令解析器 | 細節 |
--lsmod | lsmod 指令解析器 | 細節 |
--lsof | lsof 命令解析器 | 細節 |
--lspci | lspci -mmv 指令解析器 | 細節 |
--lsusb | lsusb 指令解析器 | 細節 |
--m3u | M3U 和 M3U8 檔案解析器 | 細節 |
--mdadm | mdadm 指令解析器 | 細節 |
--mount | mount 命令解析器 | 細節 |
--mpstat | mpstat 命令解析器 | 細節 |
--mpstat-s | mpstat 命令流解析器 | 細節 |
--needrestart | needrestart -b 指令解析器 | 細節 |
--netstat | netstat 指令解析器 | 細節 |
--nmcli | nmcli 命令解析器 | 細節 |
--nsd-control | nsd-control 命令解析器 | 細節 |
--ntpq | ntpq -p 命令解析器 | 細節 |
--openvpn | openvpn-status.log 檔案解析器 | 細節 |
--os-prober | os-prober 命令解析器 | 細節 |
--os-release | /etc/os-release 檔案解析器 | 細節 |
--pacman | pacman 命令解析器 | 細節 |
--passwd | /etc/passwd 檔案解析器 | 細節 |
--path | POSIX 路徑字串解析器 | 細節 |
--path-list | POSIX 路徑清單字串解析器 | 細節 |
--pci-ids | pci.ids 文件解析器 | 細節 |
--pgpass | PostgreSQL 密碼檔案解析器 | 細節 |
--pidstat | pidstat -H 指令解析器 | 細節 |
--pidstat-s | pidstat -H 命令流解析器 | 細節 |
--ping | ping 和ping6 命令解析器 | 細節 |
--ping-s | ping 和ping6 命令流解析器 | 細節 |
--pip-list | pip list 指令解析器 | 細節 |
--pip-show | pip show 指令解析器 | 細節 |
--pkg-index-apk | Alpine Linux 套件索引檔案解析器 | 細節 |
--pkg-index-deb | Debian 軟體包索引檔案解析器 | 細節 |
--plist | PLIST 檔案解析器 | 細節 |
--postconf | postconf -M 命令解析器 | 細節 |
--proc | /proc/ 檔案解析器 | 細節 |
--ps | ps 命令解析器 | 細節 |
--resolve-conf | /etc/resolve.conf 檔案解析器 | 細節 |
--route | route 命令解析器 | 細節 |
--rpm-qi | rpm -qi 命令解析器 | 細節 |
--rsync | rsync 命令解析器 | 細節 |
--rsync-s | rsync 命令流解析器 | 細節 |
--semver | 語意版本字串解析器 | 細節 |
--sfdisk | sfdisk 命令解析器 | 細節 |
--shadow | /etc/shadow 檔案解析器 | 細節 |
--srt | SRT檔案解析器 | 細節 |
--ss | ss 命令解析器 | 細節 |
--ssh-conf | ssh 設定檔和ssh -G 命令解析器 | 細節 |
--sshd-conf | sshd 設定檔和sshd -T 指令解析器 | 細節 |
--stat | stat 命令解析器 | 細節 |
--stat-s | stat 命令流解析器 | 細節 |
--swapon | swapon 指令解析器 | 細節 |
--sysctl | sysctl 命令解析器 | 細節 |
--syslog | Syslog RFC 5424 字串解析器 | 細節 |
--syslog-s | Syslog RFC 5424 字串流解析器 | 細節 |
--syslog-bsd | Syslog RFC 3164 字串解析器 | 細節 |
--syslog-bsd-s | Syslog RFC 3164 字串流解析器 | 細節 |
--systemctl | systemctl 命令解析器 | 細節 |
--systemctl-lj | systemctl list-jobs 指令解析器 | 細節 |
--systemctl-ls | systemctl list-sockets 指令解析器 | 細節 |
--systemctl-luf | systemctl list-unit-files 指令解析器 | 細節 |
--systeminfo | systeminfo 資訊命令解析器 | 細節 |
--time | /usr/bin/time 命令解析器 | 細節 |
--timedatectl | timedatectl status 指令解析器 | 細節 |
--timestamp | Unix Epoch 時間戳字串解析器 | 細節 |
--toml | TOML 文件解析器 | 細節 |
--top | top -b 命令解析器 | 細節 |
--top-s | top -b 命令流解析器 | 細節 |
--tracepath | tracepath 和tracepath6 命令解析器 | 細節 |
--traceroute | traceroute 和traceroute6 指令解析器 | 細節 |
--tune2fs | tune2fs -l 命令解析器 | 細節 |
--udevadm | udevadm info 指令解析器 | 細節 |
--ufw | ufw status 指令解析器 | 細節 |
--ufw-appinfo | ufw app info [application] 指令解析器 | 細節 |
--uname | uname -a 指令解析器 | 細節 |
--update-alt-gs | update-alternatives --get-selections 命令解析器 | 細節 |
--update-alt-q | update-alternatives --query 指令解析器 | 細節 |
--upower | upower 命令解析器 | 細節 |
--uptime | uptime 命令解析器 | 細節 |
--url | URL 字串解析器 | 細節 |
--ver | 版本字串解析器 | 細節 |
--veracrypt | veracrypt 命令解析器 | 細節 |
--vmstat | vmstat 指令解析器 | 細節 |
--vmstat-s | vmstat 命令流解析器 | 細節 |
--w | w 命令解析器 | 細節 |
--wc | wc 命令解析器 | 細節 |
--wg-show | wg show 命令解析器 | 細節 |
--who | who 命令解析器 | 細節 |
--x509-cert | X.509 PEM 和 DER 憑證檔案解析器 | 細節 |
--x509-csr | X.509 PEM 和 DER 憑證請求檔案解析器 | 細節 |
--xml | XML 檔案解析器 | 細節 |
--xrandr | xrandr 指令解析器 | 細節 |
--yaml | YAML 檔案解析器 | 細節 |
--zipinfo | zipinfo 指令解析器 | 細節 |
--zpool-iostat | zpool iostat 指令解析器 | 細節 |
--zpool-status | zpool status 命令解析器 | 細節 |
短的 | 長的 | 描述 |
---|---|---|
-a | --about | 關於jc .列印有關jc 和解析器的資訊(當然是 JSON 或 YAML!) |
-C | --force-color | 即使使用管道也強制輸出顏色(覆蓋-m 和NO_COLOR 環境變數) |
-d | --debug | 調試模式。如果遇到解析問題,則列印追蹤訊息(使用-dd 進行詳細偵錯) |
-h | --help | 幫助。使用jc -h --parser_name 取得解析器文件。使用兩次顯示隱藏的解析器(例如-hh )。使用三次來顯示解析器類別(例如-hhh )。 |
-m | --monochrome | 單色輸出 |
-M | --meta-out | 將元資料加入輸出,包括時間戳記、解析器名稱、魔術指令、魔術指令退出程式碼等。 |
-p | --pretty | 漂亮格式化 JSON 輸出 |
-q | --quiet | 安靜模式。抑制解析器警告訊息(使用-qq 忽略流解析器錯誤) |
-r | --raw | 原始輸出。提供更多的文字輸出,通常帶有字串值並且沒有額外的語義處理 |
-s | --slurp | 將多行放入數組中。 (使用-hhh 查找相容的解析器) |
-u | --unbuffer | 取消緩衝輸出 |
-v | --version | 版本資訊 |
-y | --yaml-out | YAML 輸出 |
-B | --bash-comp | 產生 Bash shell 完成腳本(更多資訊) |
-Z | --zsh-comp | 產生 Zsh shell 完成腳本(更多資訊) |
使用類似 Python 切片的START:STOP
語法支援行切片。這允許您跳過您想要jc
轉換的STDIN
輸入的開頭和/或結尾處的行。
START
和STOP
可以是正整數、負整數或空白,並允許您指定要跳過的行數和要處理的行數。正片和空白片的記憶效率最高。切片中的任何負整數都會使用更多記憶體。
例如,要跳過以下文字的第一行和最後一行,您可以透過多種方式表達切片:
$ 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 " }]
在此範例中, 1:-1
和1:4
線切片提供相同的輸出。
當使用正整數時, STOP
的索引位置不包含在內。正切片從輸入的第一行開始計數,從0
作為第一行開始計數。負切片從最後一行開始向開頭計數,從-1
開始作為最後一行。這也是Python 切片功能的工作方式。
以下是線切片選項的細分:
切片表示法 | 已處理的輸入行 |
---|---|
START:STOP | 線START 到STOP - 1 |
START: | 行START 到輸出的其餘部分 |
:STOP | 從開頭到STOP - 1 行 |
-START:STOP | START 行從末尾到STOP - 1 |
START:-STOP | START 行到STOP 行(從末尾開始) |
-START:-STOP | 從末端開始的START 線到從末端開始的STOP 線 |
-START: | START 行從末尾到輸出的其餘部分 |
:-STOP | 從開頭到結尾的STOP 行 |
: | 所有線路 |
一些解析器支援多項輸入,並且可以在一次傳遞中輸出結果數組。 Slurping 適用於接受單行輸入的字串解析器。 (例如url
和ip-address
)要查看支援--slurp
選項的解析器列表,請使用jc -hhh
。
例如,您可以使用--slurp
選項將具有多個 IP 位址(每行一個)的檔案傳送至jc
,並且將輸出一組結果:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
/proc
檔案的神奇語法會自動支援多個檔案的 slurping(無需使用--slurp
選項)。例如,您可以一次轉換多個 PID 檔案:
$ jc /proc/ * /status
[ < multiple output objects > ]
當使用/proc
magic 語法並選擇多個檔案時,會在輸出中插入一個附加的_file
字段,以便更容易判斷每個輸出物件所引用的檔案。
最後, --meta-out
選項可以與 slurped 輸出結合使用。在這種情況下,slurped 輸出被包裝在具有以下結構的物件中:
{
"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 "
]
}
}
使用--meta-out
, input_list
包含輸入清單(實際輸入字串或/proc
檔案名稱),以便您可以識別與每個輸入字串或/proc
檔案名稱相關的輸出物件。
jc
內的任何致命錯誤都會產生退出代碼100
,否則退出代碼將為0
。
當使用「魔術」語法(例如jc ifconfig eth0
)時, jc
將儲存正在解析的程式的退出程式碼並將其新增至jc
退出程式碼。這樣可以更容易確定錯誤是否來自解析的程式或jc
。
考慮使用ifconfig
的以下範例:
ifconfig 退出程式碼 | jc 退出代碼 | 組合退出代碼 | 解釋 |
---|---|---|---|
0 | 0 | 0 | 沒有錯誤 |
1 | 0 | 1 | ifconfig 錯誤 |
0 | 100 | 100 | jc 中的錯誤 |
1 | 100 | 101 | ifconfig 和jc 皆出錯 |
當使用「magic」語法時,您也可以使用--meta-out
或-M
選項來檢索被呼叫程式的退出代碼。這會將_jc_meta
物件附加到輸出,其中將包含魔術命令訊息,包括退出代碼。
這是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
您可以透過JC_COLORS
環境變數指定自訂顏色。 JC_COLORS
環境變數採用四個逗號分隔的字串值,格式如下:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
其中顏色為: black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 gray
、 brightblack
、 brightred
、 brightgreen
、 brightyellow
、 brightblue
、 brightmagenta
、 brightcyan
、 white
或default
例如,設定為預設顏色:
JC_COLORS=blue,brightblack,magenta,green
或者
JC_COLORS=default,default,default,default
您可以將NO_COLOR
環境變數設定為任何值以停用jc
中的顏色輸出。請注意,使用-C
選項強制顏色輸出將覆蓋NO_COLOR
環境變數和-m
選項。
大多數解析器從STDIN
載入所有數據,對其進行解析,然後串行輸出整個 JSON 文件。有一些流解析器(例如ls-s
和ping-s
)在從STDIN
接收資料時立即開始處理資料並將其作為 JSON 行(又稱 NDJSON)逐行輸出。這可以顯著減少解析大量命令輸出(例如ls -lR /
)所需的記憶體量,有時可以更快地處理資料。流解析器的行為與標準解析器略有不同,如下所述。
注意:流解析器不能與“magic”語法一起使用
使用流程解析器時,您可能想要忽略解析錯誤,因為這些解析器可能用於長期存在的處理管道,而錯誤可能會破壞管道。若要忽略解析錯誤,請在parse()
函數中使用-qq
cli 選項或ignore_exceptions=True
參數。這會將_jc_meta
物件加入到帶有success
屬性的 JSON 輸出。如果success
為true
,那麼解析該行就沒有問題。如果success
為false
,則發現解析問題,並且將添加error
和line
字段以分別包含簡短的錯誤描述和不可解析行的內容:
使用-qq
選項成功解析行:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
使用-qq
選項解析行失敗:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
大多數作業系統都會緩衝從一個行程傳送到另一個行程的輸出。緩衝區通常在 4KB 左右。在終端機中查看輸出時,作業系統緩衝區未佔用,因此輸出會立即顯示在螢幕上。但是,當將多個進程連接在一起時,當輸入資料非常慢時(例如ping
),輸出可能看起來像是掛起:
$ ping 1.1.1.1 | jc --ping-s | jq
這是因為在此範例中作業系統佔用了jc
和jq
之間的 4KB 緩衝區。若要在終端機上即時顯示數據,您可以使用-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...}
...
注意:對於大數據流,無緩衝輸出可能會較慢。
流解析器接受任何可迭代物件並傳回允許延遲處理資料的可迭代物件。輸入資料應在字串資料行上迭代。好的輸入資料的範例是sys.stdin
或str.splitlines()
。
要在程式碼中使用返回的可迭代對象,只需循環它或使用 next() 內建函數:
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
解析器插件可以放置在本機「應用程式資料目錄」的jc/jcparsers
資料夾中:
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
解析器插件是標準的 python 模組檔案。使用jc/parsers/foo.py
或jc/parsers/foo_s.py (streaming)
解析器作為模板,只需將.py
檔案放在jcparsers
子資料夾中即可。任何依賴項都可以放置在jcparsers
上方的jc
資料夾中,並且可以在解析器程式碼中導入。
解析器插件檔案名稱必須是有效的 python 模組名稱,因此必須以字母開頭並完全由字母數字和底線組成。本機插件可能會覆蓋預設解析器。
注意:應用程式資料目錄遵循XDG基本目錄規範
為了獲得最佳結果,請透過修改LC_ALL
變數將區域設定環境變數設定為C
或en_US.UTF-8
:
$ LC_ALL=C date | jc --date
您也可以單獨設定區域設定變數:
$ export LANG=C
$ export LC_NUMERIC=C
在某些較舊的系統上,如果C
語言環境不支援 UTF-8 編碼,則 UTF-8 輸出將降級為帶有\u
轉義序列的 ASCII。
一些解析器已將計算的紀元時間戳字段添加到輸出中。除非時間戳字段名稱有_utc
後綴,否則它被認為是幼稚的。 (即基於運行jc
解析器的系統的本機時區)。
如果可以在指令輸出的文字中偵測到 UTC 時區,則時間戳記將是時區感知的,並且金鑰名稱上有_utc
後綴。 (例如epoch_utc
)感知時間戳記不支持其他時區。
jc
可以在大多數 shell 中使用。一些現代 shell 內建了 JSON 反序列化和過濾功能,這使得使用jc
更加方便。
例如,NGS(下一代 Shell)中可以進行以下操作:
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
這會執行jc
,解析輸出 JSON,並將結果資料結構指派給單行程式碼中的變數。
有關如何在其他 shell 中使用jc
的更多範例,請參閱此 wiki 頁面。
一些解析器(例如dig
、 xml
、 csv
等)可以在任何平台上運作。其他轉換特定於平台的輸出的解析器如果在不受支援的平台上運行,將產生警告訊息。若要查看所有解析器資訊(包括相容性),請執行jc -ap
。
您可能仍然在不支援的平台上使用解析器 - 例如,您可能想要在 macOS 或 Windows 筆記型電腦上解析具有 linux lsof
輸出的檔案。在這種情況下,您可以使用-q
cli 選項或parse()
中的quiet=True
函數參數來抑制警告訊息:
蘋果系統:
cat lsof.out | jc -q --lsof
或Windows:
type lsof.out | jc -q --lsof
測試於:
請隨意添加/改進程式碼或解析器!您可以使用jc/parsers/foo.py
或jc/parsers/foo_s.py (streaming)
解析器作為模板,並透過拉取請求提交解析器。
請參閱貢獻指南以獲取更多資訊。
ifconfig-parser
模組由 KnightWhoSayNi 提供xmltodict
模組ruamel.yaml
模組,作者:Anthon van der Neuttrparse
模組以下是jc
輸出的一些範例。如需更多範例,請參閱此處或解析器文件。
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 凱莉巴西