一个简单的cli工具,用于在终端中将JSON和JSON行数据打印为一个表。
jtbl的Python项目详细描述
jtbl公司
一个简单的cli工具,在终端中将JSON数据打印为表。在
jtbl
接受来自stdin
的管道JSON数据,并将文本表表示形式输出到stdout
。e、 g组:
$ cat cities.json | jtbl
LatD LatM LatS NS LonD LonM LonS EW City State
------ ------ ------ ---- ------ ------ ------ ---- ----------------- -------
41 5 59 N 80 39 0 W Youngstown OH
42 52 48 N 97 23 23 W Yankton SD
46 35 59 N 120 30 36 W Yakima WA
42 16 12 N 71 48 0 W Worcester MA
43 37 48 N 89 46 11 W Wisconsin Dells WI
36 5 59 N 80 15 0 W Winston-Salem NC
49 52 48 N 97 9 0 W Winnipeg MB
jtbl
需要JSON对象的JSON数组或JSON Lines。在
使用jc
来JSONify命令行输出,通过jq
之类的工具进行过滤,并显示在jtbl
中,这可能很有用:
安装
pip3 install --upgrade jtbl
使用
只需将JSON数据管道传输到jtbl
。(例如cat
一个JSON文件,jc
,jq
,aws
cli,kubectl
等)
$ <JSON Data> | jtbl [OPTIONS]
选项
--cols=n
手动配置终端宽度-n
如果终端宽度太长,则不进行数据包装(覆盖--cols
和{}) - ^{17>而不是cde>对数据的包装宽度太长
-v
打印版本信息-h
打印帮助信息
兼容的JSON格式
jtbl
最适合于JSON对象的浅数组。每个对象都应该有一些元素,这些元素将被转换为表列。幸运的是,这就是多少API显示它们的数据。在
JSON数组示例
[
{
"unit": "proc-sys-fs-binfmt_misc.automount",
"load": "loaded",
"active": "active",
"sub": "waiting",
"description": "Arbitrary Executable File Formats File System Automount Point"
},
{
"unit": "sys-devices-pci0000:00-0000:00:07.1-ata2-host2-target2:0:0-2:0:0:0-block-sr0.device",
"load": "loaded",
"active": "active",
"sub": "plugged",
"description": "VMware_Virtual_IDE_CDROM_Drive"
},
...
]
jtbl
也可以使用具有类似功能的JSON Lines格式。在
JSON行示例
{"name": "docker0", type": "Ethernet", "ipv4_addr": "172.17.0.1", "ipv4_mask": "255.255.0.0"}
{"name": "ens33", "type": "Ethernet", "ipv4_addr": "192.168.71.146", "ipv4_mask": "255.255.255.0"}
{"name": "lo", "type": "Local Loopback", "ipv4_addr": "127.0.0.1", "ipv4_mask": "255.0.0.0"}
...
过滤JSON输入
如果元素太多,或者元素中的数据太大,则表可能无法放入终端屏幕。在这种情况下,您可以使用一个JSON过滤器,比如jq
或jello
只发送jtbl
您感兴趣的元素:
jq
数组方法
下面的示例使用jq
过滤并将过滤后的元素格式化为适当的JSON数组。在
$ cat /etc/passwd | jc --passwd | jq '[.[] | {username, shell}]'
[
{
"username": "root",
"shell": "/bin/bash"
},
{
"username": "bin",
"shell": "/sbin/nologin"
},
{
"username": "daemon",
"shell": "/sbin/nologin"
},
...
]
(注意过滤器周围的方括号)
jq
Slurp方法
{proper{JSON'和filtered^'数组中的元素使用。在
$ cat /etc/passwd | jc --passwd | jq '.[] | {username, shell}' | jq -s
[
{
"username": "root",
"shell": "/bin/bash"
},
{
"username": "bin",
"shell": "/sbin/nologin"
},
{
"username": "daemon",
"shell": "/sbin/nologin"
},
...
]
(注意末尾的jq -s
)
jq
JSON行方法
以下示例将以JSON行格式发送数据,jtbl
可以理解:
$ cat /etc/passwd | jc --passwd | jq -c '.[] | {username, shell}'
{"username":"root","shell":"/bin/bash"}
{"username":"bin","shell":"/sbin/nologin"}
{"username":"daemon","shell":"/sbin/nologin"}
...
(注意使用了-c
选项)
jello
列表理解法
如果您喜欢使用python list和dictionary语法来过滤JSON数据,可以使用jello
:
$ cat /etc/passwd | jc --passwd | jello '[{"username": x["username"], "shell": x["shell"]} for x in _]'
[
{
"username": "root",
"shell": "/bin/bash"
},
{
"username": "bin",
"shell": "/sbin/nologin"
},
{
"username": "daemon",
"shell": "/sbin/nologin"
},
...
]
将其中任何一个管道输送到jtbl
时,将得到以下结果:
$ cat /etc/passwd | jc --passwd | jello '[{"username": x["username"], "shell": x["shell"]} for x in _]' | jtbl
username shell
--------------- --------------
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
...
使用更深层次的JSON结构
jtbl
很乐意将深度嵌套的JSON结构转储到一个表中,但通常这不是您要寻找的。在
$ jc dig www.cnn.com | jtbl
+-------+----------+----------+--------------+-------------+--------------+-----------------+------------------+--------------+--------------+--------------+----------+--------------+--------+
| id | opcode | status | flags | query_num | answer_num | authority_num | additional_num | question | answer | query_time | server | when | rcvd |
+=======+==========+==========+==============+=============+==============+=================+==================+==============+==============+==============+==========+==============+========+
| 28791 | QUERY | NOERROR | ['qr', 'rd', | 1 | 5 | 0 | 1 | {'name': 'ww | [{'name': 'w | 32 | 2600 | Fri Mar 06 1 | 143 |
| | | | 'ra'] | | | | | w.cnn.com.', | ww.cnn.com.' | | | 7:15:25 PST | |
| | | | | | | | | 'class': 'I | , 'class': ' | | | 2020 | |
| | | | | | | | | N', 'type': | IN', 'type': | | | | |
| | | | | | | | | 'A'} | 'CNAME', 't | | | | |
| | | | | | | | | | tl': 251, 'd | | | | |
| | | | | | | | | | ata': 'turne | | | | |
| | | | | | | | | | r-tls.map.fa | | | | |
| | | | | | | | | | stly.net.'}, | | | | |
| | | | | | | | | | {'name': 't | | | | |
| | | | | | | | | | urner-tls.ma | | | | |
| | | | | | | | | | p.fastly.net | | | | |
| | | | | | | | | | ... | | | | |
+-------+----------+----------+--------------+-------------+--------------+-----------------+------------------+--------------+--------------+--------------+----------+--------------+--------+
使用jq
或jello
深入研究JSON:
要获取您感兴趣的数据,可以使用jq
或{
使用jq
:
$ jc dig www.cnn.com | jq '.[0].answer'
或使用jello
:
$ jc dig www.cnn.com | jello '_[0]["answer"]'
两者都将产生以下输出:
[
{
"name": "www.cnn.com.",
"class": "IN",
"type": "CNAME",
"ttl": 90,
"data": "turner-tls.map.fastly.net."
},
{
"name": "turner-tls.map.fastly.net.",
"class": "IN",
"type": "A",
"ttl": 20,
"data": "151.101.1.67"
}
...
]
这将在jtbl
中生成下表
$ jc dig www.cnn.com | jello '_[0]["answer"]' | jtbl
name class type ttl data
-------------------------- ------- ------ ----- --------------------------
www.cnn.com. IN CNAME 11 turner-tls.map.fastly.net.
turner-tls.map.fastly.net. IN A 23 151.101.129.67
turner-tls.map.fastly.net. IN A 23 151.101.1.67
turner-tls.map.fastly.net. IN A 23 151.101.65.67
turner-tls.map.fastly.net. IN A 23 151.101.193.67
列宽
jtbl
如果检测到输出大于终端宽度,它将尝试将列缩小到正常大小。--cols
选项将覆盖自动终端宽度检测。在
当终端宽度对所有数据都太小时,可以使用-t
选项截断行,而不是换行。在
-n
选项禁用包装并覆盖--cols
和-t
选项。在
这有助于结合less -S
呈现一个宽度无限的非包装表格:
$ jc ps aux | jtbl -n | less -S
user pid vsz rss tt stat started time command
------------------ ----- --------- ------ ---- ------ --------- --------- ---------------------------------------------------
joeuser 34029 4277364 24800 s000 S+ 9:28AM 0:00.27 /usr/local/Cellar/python/3.7.6_1/Frameworks/Python....
joeuser 34030 4283136 17104 s000 S+ 9:28AM 0:00.20 /usr/local/Cellar/python/3.7.6_1/Frameworks/Python....
joeuser 481 5728568 189328 S 17Apr20 21:46.52 /Applications/Utilities/Terminal.app/Contents/MacOS...
joeuser 45827 6089084 693768 S Wed01PM 84:54.87 /Applications/Microsoft Teams.app/Contents/Framewor...
joeuser 1493 9338824 911600 S 17Apr20 143:27.08 /Applications/Microsoft Outlook.app/Contents/MacOS/...
joeuser 45822 5851524 163840 S Wed01PM 38:48.83 /Applications/Microsoft Teams.app/Contents/MacOS/Te...
- 项目
标签: