查看面向开发人员的
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 凯莉巴西