jo命令介绍
jo命令是"Json Output"的简写,是linux系统shell里用来创建json字符串或文本的工具。它可以从文本文件里去读取json字符串,也可以根据你要提供的key,value去生成一个json字符串,是一个比较好用的工具。
不同于另外一个jq
工具,jo
命令主要是用来生成json字符串或文件的,而jq
工具更常用的功能去做json对象的解析。
jo命令的安装
本测试环境是在CentOS7的测试环境进行安装的,使用yum实测可以安装,其他发行版请自行测试。
- 安装epel源
yum install epel-release
- 安装jo工具
yum install jo
jo的基本使用
一、普通JSON对象
最简单的使用格式就是:
jo ke=value
或者
jo key@value
如:
[root@zyf-tox ~]# jo name=Bob
{"name":"Bob"}
key@value or key=value
需要注意的是,如果无论是key@value还是用key=value的形式,jo都会将key视作字符串。
对于key@value这类,jo会将value视为bool值。当value为0时,会自动处理为false,其他整数会视作true;
当value为t或T开头的字符串时,会视为true;其他字符串视为false。
示例如下:
[root@zyf-tox ~]# jo a=ff
{"a":"ff"}
[root@zyf-tox ~]# jo a=ff^C
[root@zyf-tox ~]# jo a@T
{"a":true}
[root@zyf-tox ~]# jo a@1
{"a":true}
[root@zyf-tox ~]# jo a@0
{"a":false}
[root@zyf-tox ~]# jo a@123
{"a":true}
[root@zyf-tox ~]# jo a@"123"
{"a":true}
[root@zyf-tox ~]# jo a@hehe
{"a":false}
对于key=value这类,默认情况下,jo会自行判断类型。如"123"会将其识别为整数,“True/False"会识别为bool值,不设置value值,或value为"null”,则会识别为null对象,
[root@zyf-tox ~]# jo a=string
{"a":"string"}
[root@zyf-tox ~]# jo a=123
{"a":123}
[root@zyf-tox ~]# jo a=
{"a":null}
[root@zyf-tox ~]# jo a=null
{"a":null}
[root@zyf-tox ~]# jo a=true
{"a":true}
[root@zyf-tox ~]# jo a=false
{"a":false}
二、Json数组
jo命令使用-a
参数可以将一些字符串组成json列表,示例如下:
[root@compute01.compute-pub-dev sushy ]# jo -a John Bosh Tom
["John","Bosh","Tom"]
三、复合json串
将以上的使用方式结合起来,可以实现通用的json编写了,如:
[root@compute01.compute-pub-dev sushy ]# jo name=Bose age=35 children=$(jo -a John Bosh Tome)
{"name":"Bose","age":35,"children":["John","Bosh","Tome"]}
jo的其他参数
- 美化打印
-p
上面展示的json串都是一行输出的,要想展示为解析格式,使用-p参数,如:[root@ironic0003.cn-gpudev iso ]# jo -p name=Bose age=35 children=$(jo -a John Bosh Tome) { "name": "Bose", "age": 35, "children": [ "John", "Bosh", "Tome" ] }
- 强制指定类型
如前述说明在key=value格式下,jo会自行判断value的格式。jo同样提供了一些参数,可以让你强制指定value的格式:
-s
:指定value为字符串
-n
: 指定value为数字
-b
: 指定value为bool值
给出man手册里的例子如下:
注意:使用-s/-n/-b参数时,需要在参数前加上参数 -s -n -b 不加参数(默认) ───────────────────────────────────────────────────────────────────── a= “a”:"" “a”:0 “a”:false “a”:null a=string “a”:“string” “a”:6 “a”:true “a”:“string” a="quoted" “a”:“"quoted"” “a”:8 “a”:true “a”:“"quoted"” a=12345 “a”:“12345” “a”:12345 “a”:true “a”:12345 a=true “a”:“true” “a”:1 “a”:true “a”:true a=false “a”:“false” “a”:0 “a”:false “a”:false a=null “a”:"" “a”:0 “a”:false “a”:null
--
,否则参数无法被识别。
用法如下:[root@ironic0003.cn-gpudev iso ]# jo -p -- -s number=123 { "number": "123" }
- 关闭Bool/null类型探测
-B
使用该参数后,null/true/fase等值不会再被解释为bool值,而是作为字符串。但如果不设置value,仍然会解释为null。[root@compute01.compute-pub-dev sushy ]# jo -B a=true {"a":"true"} [root@compute01.compute-pub-dev sushy ]# jo a=true {"a":true} [root@compute01.compute-pub-dev sushy ]# jo a=null {"a":null} [root@compute01.compute-pub-dev sushy ]# jo -B a=null {"a":"null"} [root@compute01.compute-pub-dev sushy ]# jo -B a= {"a":null}
- -d参数,指定分隔符分隔key。
jo支持通过分隔符设定多级key,这样可以在json里同时设置嵌套json。实例如下:
如果不使用该参数,则效果如下:[root@compute01.compute-pub-dev sushy ]# jo -p -d . name="Bob" feature.eyes=big feature.gender=male feature.age=35 { "name": "Bob", "feature": { "eyes": "big", "gender": "male", "age": 35 } }
[root@compute01.compute-pub-dev sushy ]# jo -p name="Bob" feature.eyes=big feature.gender=male feature.age=35 { "name": "Bob", "feature.eyes": "big", "feature.gender": "male", "feature.age": 35 }
-f
参数,从文件中读取和合并json
使用该参数,jo可以从文件中读取json串,但是读取完成后不会直接打印出来,而是等待标准输入,此时你可以继续输入其他信息,这些信息会和从文件中读取的json合并,最终打印出来(连续敲两次回车后jo会等待标准输入状态跳出来)。
示例如下:
上面的c=d, e=f是在标准输入里额外敲的。[root@compute01.compute-pub-dev sushy ]# cat /tmp/test.json {"a":"b"} [root@compute01.compute-pub-dev sushy ]# jo -f /tmp/test.json c=d e=f {"a":"b","c":"d","e":"f"}
如果只想让jo读取文件,不再等待标准输入,使用/dev/null进行输入重定向皆可。[root@compute01.compute-pub-dev sushy ]# jo -f /tmp/test.json < /dev/null {"a":"b"}
其他使用
jo支持从管道中读取数据流。如:
[root@ironic0003.cn-gpudev abc ]# ls
a b c d
[root@ironic0003.cn-gpudev abc ]# ls | jo -a
["a","b","c","d"]
[root@ironic0003.cn-gpudev abc ]#