shell命令:生成json的工具jo命令介绍

jo命令介绍

jo命令是"Json Output"的简写,是linux系统shell里用来创建json字符串或文本的工具。它可以从文本文件里去读取json字符串,也可以根据你要提供的key,value去生成一个json字符串,是一个比较好用的工具。
不同于另外一个jq工具,jo命令主要是用来生成json字符串或文件的,而jq工具更常用的功能去做json对象的解析。

jo命令的安装

本测试环境是在CentOS7的测试环境进行安装的,使用yum实测可以安装,其他发行版请自行测试。

  1. 安装epel源
    yum install epel-release
    
  2. 安装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的其他参数

  1. 美化打印-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"
       ]
    }
    
  2. 强制指定类型
    如前述说明在key=value格式下,jo会自行判断value的格式。jo同样提供了一些参数,可以让你强制指定value的格式:
    -s:指定value为字符串
    -n: 指定value为数字
    -b: 指定value为bool值
    给出man手册里的例子如下:
       参数          -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
    
    注意:使用-s/-n/-b参数时,需要在参数前加上--,否则参数无法被识别。
    用法如下:
    [root@ironic0003.cn-gpudev iso ]# jo -p -- -s number=123
    {
       "number": "123"
    }
    
  3. 关闭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}
    
  4. -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
    }
    
  5. -f参数,从文件中读取和合并json
    使用该参数,jo可以从文件中读取json串,但是读取完成后不会直接打印出来,而是等待标准输入,此时你可以继续输入其他信息,这些信息会和从文件中读取的json合并,最终打印出来(连续敲两次回车后jo会等待标准输入状态跳出来)。
    示例如下:
    [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"}
    
    
    上面的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 ]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要利用Shell脚本提取系统信息并生成JSON文件,可以按照以下步骤进行操作: 1. 创建一个Shell脚本文件,比如`system_info.sh`,并在文件开头添加Shebang:`#!/bin/bash`。 2. 使用各种命令工具来提取系统信息,并将其存储在变量中。例如,可以使用`uname -a`命令获取系统的内核版本,使用`lsb_release -d`命令获取发行版信息,使用`free -m`命令获取内存使用情况等。 3. 创建一个关联数组(associative array),用于存储系统信息的键值对。键(key)表示信息的类型,值(value)表示信息的具体内容。例如,可以使用`declare -A sys_info`命令创建一个关联数组。 4. 将提取到的系统信息存储到关联数组中。将信息的类型作为键,信息的内容作为值。例如,可以使用`sys_info["kernel_version"]=$(uname -a)`命令将内核版本信息存储到关联数组中。 5. 使用JSON格式来表示关联数组中的信息,并将其写入到一个JSON文件中。可以使用`echo`命令结合字符串拼接的方式生成JSON格式的字符串,并使用重定向符号将其写入到文件中。例如,可以使用以下命令将关联数组中的信息写入到`system_info.json`文件中: ```shell echo "{" for key in "${!sys_info[@]}"; do echo "\"${key}\": \"${sys_info[$key]}\"," done echo "}" > system_info.json ``` 6. 运行Shell脚本,生成JSON文件。在终端中执行`./system_info.sh`命令,即可运行脚本并生成`system_info.json`文件。 通过以上步骤,你可以使用Shell脚本提取系统信息并将其保存为JSON文件,方便后续的处理和使用。请根据实际需要调整脚本中的命令和信息类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值