[转帖]linux命令行下如何格式化json并进行各种json处理操作

linux,命令行,如何,格式化,json,进行,各种,处理,操作 · 浏览次数 : 0

小编点评

```json { "id": "0", "model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz" }, { "id": "1", "model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz" } ``` **类型转换:** ```json { "name": "liuxin", "age": "30", "sex": "male" }, { "name": "jiaweiqiang", "age": "29", "sex": "femal" } ``` **数组操作:** ```json { "name": "liuxin", "age": "30", "sex": "male" }, { "name": "jiaweiqiang", "age": "29", "sex": "femal" } ``` **高级查询:** ```json { "name": "liuxin", "age": "30", "sex": "male" }, { "name": "jiaweiqiang", "age": "29", "sex": "femal" } ```

正文

https://blog.csdn.net/penriver/article/details/122016563

有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理、总结。
在Linux系统下基于python json.tool可以格式化json,使用jq工具可以非常方便的处理json,可以创建生成json、编辑json、进行各种查询操作及类型转换

1. 基于python json.tool格式化json

1.1.直接格式化json字符串或文件

echo '{"status":"200","data":[{"id":123,"addr":"广州天河"}],"time":1595921796,"info":"测试测试"}' | python -m json.tool

#文件较长的情况, 导出文件用vim查看
cat json.txt | python -m json.tool

#文件较长的情况, 导出文件用vi查看
cat json.txt | python -m json.tool > json.json
vi json.json

    1.2.格式化http返回的结果

     curl -X POST 'http://ip.taobao.com/outGetIpInfo?ip=114.114.114.114&accessKey=alibaba-inc' | python -m json.tool
    

      在这里插入图片描述

      1.3.疑难解决:格式化后中文乱码

      见1.2.格式化后的结果,针对中文,转化为ASCII编码进行了展示,需要进行源码修改,才能解决此问题

      • 在当前用户目录下 或 根目录下查询tool.py文件
      • 修改tool.py文件,在json.dump方法中增加ensure_ascii=False参数,即让json.tool模块不强行保证json的内容都转为ASCII编码
      • 修改后再执行命令curl -X POST 'http://ip.taobao.com/outGetIpInfo?ip=223.5.5.5&accessKey=alibaba-inc' | python -m json.tool,则能正确的输出中文字符串

      注意:

      • json/tool.py 对应 -m json.tool
      • json5/tool.py 对应 -m json5.tool
      • simplejson/tool.py 对应 -m simplejson.tool
      find ~ -name tool.py
      find / -name tool.py
      

        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

        2. jq

        2.1. jq介绍

        jq是一个轻量级且灵活的命令行JSON处理器。
        在Linux系统下使用jq工具可以非常方便的处理json,可以创建生成json、编辑json、进行各种查询操作及类型转换

        • jq类似于JSON数据的sed——您可以使用它来切片、过滤、映射和转换结构化数据,就像sed、awk、grep和其他命令让您轻松处理文本一样。
        • jq是用可移植的C编写的,它没有运行时依赖项。您可以下载一个二进制文件,将其scp到很远的相同类型的机器上,并期待它能够工作。
        • jq可以轻松地将您拥有的数据格式转换为您想要的格式,而实现此目的的程序通常比您预期的更短、更简单。
        • 源码地址
        • 使用文档

        2.2.安装jq

        在centos 7.x上安装jq

        yum install epel-release
        yum install jq
        jq --version
        

          显示:jq-1.6

          2.3. 使用示例

          2.3.1. 创建

          [root@node22 ~]# jq -n {a:1}
          {
            "a": 1
          }
          

            2.3.2. 合并

            [root@node22 ~]# jq -n '{a:"test"} + {b:2}'
            {
              "a": "test",
              "b": 2
            }
            [root@node22 ~]# jq -n '{a:"test"} + {b:2} + {c:"testc"}'
            {
              "a": "test",
              "b": 2,
              "c": "testc"
            }
            

              2.3.3. 删除

              [root@node22 ~]#  cat test.json 
              {"a": "test","b": 2, "c": "testc"}
              [root@node22 ~]#  cat test.json |jq .
              {
                "a": "test",
                "b": 2,
                "c": "testc"
              }
              [root@node22 ~]#  cat test.json |jq 'del(.b)'
              {
                "a": "test",
                "c": "testc"
              }
              

                2.3.4. 更新

                [root@node22 ~]# cat test.json |jq '.b="testb"'
                {
                  "a": "test",
                  "b": "testb",
                  "c": "testc"
                }
                [root@node22 ~]# cat test.json |jq '. + {d:4}'
                {
                  "a": "test",
                  "b": 2,
                  "c": "testc",
                  "d": 4
                }
                [root@node22 ~]# cat test.json |jq '. + {d:4}' |jq '.d={dd:5}'
                {
                  "a": "test",
                  "b": 2,
                  "c": "testc",
                  "d": {
                    "dd": 5
                  }
                }
                

                  2.3.5. 查询

                  [root@node22 ~]# cat test.json |jq .
                  {
                    "a": "test",
                    "b": 2,
                    "c": "testc",
                    "d": {
                      "dd": 5
                    }
                  }
                  [root@node22 ~]# cat test.json |jq '. + {d:4}' |jq '.d={dd:5}' |jq .d.dd
                  5
                  [root@node22 ~]# echo '{"a":1,"b":2}' |jq '[.a,.b]'
                  [
                    1,
                    2
                  ]
                  

                    2.3.6. 查看数据类型

                    [root@node22 ~]#  echo "{}" |jq -r type
                    object
                    [root@node22 ~]#  echo '[0, false, [], {}, null, "hello"]' |jq 'map(type)'
                    [
                      "number",
                      "boolean",
                      "array",
                      "object",
                      "null",
                      "string"
                    ]
                    

                      2.3.7. 数组操作

                      #查询数组的长度
                      [root@node22 ~]#  echo [1,2,3] |jq .[1]
                      2
                      [root@test-dhcp ~]# echo [1,2,3] |jq .[0,2]
                      1,3
                      #查询数组长度
                      [root@node22 ~]# echo [1,2,3,9] |jq '.|length'
                      4
                      #数组相加
                      [root@node22 ~]# echo [1,2,3] |jq '. + [4,5,6]'
                      [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6
                      ]
                      

                        2.3.8. 高级查询

                        [root@node22 ~]# echo [1,2,3] | jq 'map(select(. >= 2))'
                        [
                          2,
                          3
                        ]
                        [root@node22 ~]# echo [1,2,3] | jq 'map(select(. == 2))'
                        [
                          2
                        ]
                        [root@node22 ~]# echo [1,2,3] | jq 'map(select(. != 2))'
                        [
                          1,
                          3
                        ]
                        [root@node22 ~]# cat test.json 
                        [
                          {
                            "id": "0",
                            "model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
                          },
                          {
                            "id": "1",
                            "model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
                          }
                        ]
                        [root@node22 ~]# cat test.json |jq .[].model
                        "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
                        "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
                        

                          2.3.9. 类型转换

                          [root@node22 ~]# echo '["a","b,c,d","e"]' |jq 'join(",")'
                          "a,b,c,d,e"
                          [root@node22 ~]# cat test.json 
                          liuxin,30,male
                          jiaweiqiang,29,femal
                          [root@node22 ~]# jq -R 'split(",")|{"name":.[0],"age":.[1],"sex":.[2]}' ./test.json 
                          {
                            "name": "liuxin",
                            "age": "30",
                            "sex": "male"
                          }
                          {
                            "name": "jiaweiqiang",
                            "age": "29",
                            "sex": "femal"
                          }
                          [root@node22 ~]# cat test.json 
                          {
                            "name": "liuxin",
                            "age": "30",
                            "sex": "male"
                          }
                          {
                            "name": "jiaweiqiang",
                            "age": "29",
                            "sex": "femal"
                          }
                          [root@node22 ~]# cat test.json |jq . -c
                          {"name":"liuxin","age":"30","sex":"male"}
                          {"name":"jiaweiqiang","age":"29","sex":"femal"}
                          
                            文章知识点与官方知识档案匹配,可进一步学习相关知识
                            CS入门技能树Linux进阶新增用户21806 人正在系统学习中

                            与[转帖]linux命令行下如何格式化json并进行各种json处理操作相似的内容:

                            [转帖]linux命令行下如何格式化json并进行各种json处理操作

                            https://blog.csdn.net/penriver/article/details/122016563 有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理、总结。 在Linux系统下基于python json.tool可以格式化json,

                            [转帖]学习linux必须知道的命令

                            https://www.cnblogs.com/aibeier/p/15315487.html 基础不牢,地动山摇。在linux命令行下查看命令帮助man用于查看命令的帮助信息 man cp--help cd --helpinfo查看程序对应文档信息的命令,可以作为man和help命令的帮助补充in

                            [转帖]Linux下curl用法详解

                            https://zhuanlan.zhihu.com/p/430490147 Curl(CommandLine Uniform Resource Locator),即在命令行中利用URL进行数据或者文件传输,它是Linux下强大的http命令行工具,其功能十分强大,我们来看下帮助页面,参数非常丰富。

                            [转帖]Linux下wget命令详解

                            https://zhuanlan.zhihu.com/p/429960828 wget命令是Linux系统用于从Web下载文件的命令行工具,支持 HTTP、HTTPS及FTP协议下载文件,而且wget还提供了很多选项,例如下载多个文件、后台下载,使用代理等等,使用非常方便。 接下来就介绍一下wget

                            [转帖]Linux中find命令使用示例

                            https://zhuanlan.zhihu.com/p/99170116 Linux查找命令是类Unix操作系统中最重要且最常用的命令行实用程序之一。 查找命令可以根据你设定的参数匹配的文件指定的条件来搜索和查找文件或目录的列表。 查找可以在多种条件下使用,例如可以按权限,用户,组,文件类型,日期

                            [转帖]ESXi命令行shell下最常用的命令

                            https://forum.huawei.com/enterprise/zh/thread/580931293695328256 services.sh – Linux服务通常使用services命令管理,管理ESXi服务是通过使用services.sh命令实现的。Services.sh命令支持的参

                            [转帖]硬盘监控和分析工具:Smartctl

                            Smartctl(S.M.A.R.T自监控,分析和报告技术)是类Unix下实施SMART任务命令行套件或工具,它用于打印SMART自检和错误日志,启用并禁用SMRAT自动检测,以及初始化设备自检。 Smartctl对于Linux物理服务器非常有用,在这些服务器上,可以智能的对磁盘进行错误检查,并将硬

                            [转帖]使用 tc netem 模拟网络异常

                            https://cizixs.com/2017/10/23/tc-netem-for-terrible-network/ 在某些情况下,我们需要模拟网络很差的状态来测试软件能够正常工作,比如网络延迟、丢包、乱序、重复等。linux 系统强大的流量控制工具 tc 能很轻松地完成,tc 命令行是 ipr

                            [转帖]Linux服务器上监控网络带宽的18个常用命令-2

                            https://www.cnblogs.com/fan-yuan/p/9231501.html 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。 这些工具使用不同的机制来制作流量报告。

                            [转帖]解析Linux gcore: 揭示程序内存捕获的秘密(linuxgcore)

                            https://www.dbs724.com/133618.html Linux gcore 是一种在Linux系统中使用命令行工具捕获进程内存内容的方法。它允许程序员制定程序的一个内存快照,从而帮助他们了解在特定时刻,程序的内部状态是什么状态。 通过生成一个进程的Core文件(也称为“内存快照”或