[转帖]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 批量修改文件格式

                            将Windows上的shell脚本拷贝到Linux时,脚本的编码格式还是docs,需要改成unix才可执行,在文件不多的情况下可以直接手动更改,但是在脚本文件比较多的时候,手动改起来就太麻烦了,此时就可以使用shell命令批量来进行更改。 批量更改脚本如下: for i in `find . -ty

                            【转帖】Linux中如何取消ln链接?(linuxln取消)

                            https://www.dbs724.com/163754.html Linux系统使用ln命令可以快速创建链接,ln链接是指把文件和目录链接起来,当改变源时可以快速地改变整个目录下的文件和目录。有时候,某些文件或者目录链接起来不是我们需要的,我们需要使用Linux取消ln链接命令。下面就来简单介绍

                            [转帖]《Linux性能优化实战》笔记(三)—— CPU 上下文切换(下)

                            上篇介绍了三种CPU 上下文切换以及它们可能造成的问题和原因,这一篇来看看在系统中如何发现CPU 上下文切换问题。 一、 查看上下文切换情况 主要使用两个命令:vmstat以及之前用过的pidstat。 1. vmstat # 每隔5秒输出1组数据vmstat 5 procs memory swap

                            [转帖]50个应知必会的Linux常识和操作

                            1.存放用户账号的文件在哪里? /etc/passwd 1 2.如何删除一个非空的目录? rm -rf 目录名 1 3.查看当前的工作目录用什么命令? pwd 1 4.创建一个文件夹用什么命令? mkdir 1 5.哪个Linux命令可以一次显示一页内容?上一页和下一页使用什么命令? more Sp

                            [转帖]iptables命令详解和举例(完整版)

                            1、防火墙概述 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。 目前市面上比较

                            [转帖]Linux下lshw,lsscsi,lscpu,lsusb,lsblk硬件查看命令

                            注意:如有提示命令找不到command not found,请自行安装所需命令。 1、lshw查看所有硬件摘要信息 下面命令可以查看所有硬件摘要信息,并输出成一个html文件,把此html文件导出到电脑上,直接打开,可以清楚的看到硬件信息: [root@localhost /]# lshw -htm

                            [转帖]Linux之fstab文件详解

                            https://blog.yelvlab.cn/archives/592/ fstab文件是干什么用的: /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系

                            [转帖]Linux之/etc/fstab文件讲解

                            https://www.cnblogs.com/FengGeBlog/p/10178824.html /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系统启

                            [转帖]前后台切换命令(ctrl+z jobs bg fg &)

                            当我在终端里面运行某个命令的时候,结果不是很快就能出来的那种,或者是一大堆字在屏幕上狂翻。这个时候,有时ctrl+c也不起作用,那我会用ctrl+z退出来,这个很有效,但是说实话我不知道为什么这个可以退出,以及有什么后果,今天看到一篇博客,内容如下: linux下fg、bg、ctrl + z、job