日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Shell下处理JSON数据工具向导

發布時間:2023/12/24 javascript 41 coder
生活随笔 收集整理的這篇文章主要介紹了 Shell下处理JSON数据工具向导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄
  • 下載離線安裝包
  • 安裝
    • 源碼包安裝
  • 選項及含義
  • JQ 程序代碼演示在線平臺
  • JQ 語法
    • 基本過濾器
      • 身份運算符 --- .
      • 標識符-索引 --- .foo`, `.foo.bar
      • 對象索引 --- .[<string>]
      • 數組索引 --- .[<number>]
      • 數組/字符串切片 --- .[<number>:<number>]
      • 數組/對象值迭代器 --- .[]
      • 逗號 --- ,
      • 管道 --- |
      • 括號 --- ()
    • 數據類型
      • 數組 --- []
      • 字典 --- {}
    • 內置運算符
    • 內置函數
  • 參考演示數據 --- suosuo.json
  • 參考命令
    • 打印
      • 去除引號
    • 元素獲取
      • 當一級元素并列存在2個或2個以上的字典時
      • 當一級元素并列存在2個或2個以上的列表時
      • 當一級元素為一個列表【數組】時 -- 根據索引獲取元素
      • 當一級元素為一個字典時 -- 根據 Key 獲取 Value
    • 場景代碼示例
      • 獲取硬盤分區
      • 獲取所有硬盤設備名 --- lsblk
      • 獲取 Docker 容器網絡配置
    • 高級用法示例
      • 賦值
      • 對結果重定向
      • 字典的構造
      • 數組的構造
      • 嵌套字典的構造
      • 嵌套列表的構造
  • 參考網址

	jq程序是一個"過濾器"。它接受一個輸入, 然后生成一個輸出,有很多內置的過濾器用于提取對象的特定字段,或者將數字轉換為字符串, 或其他各種標準任務。
	該過濾器可以以各種方式組合,可以通過管道將將一個濾波器轉換為另一個濾波器,或收集濾波器的輸出為一個數組。
	有些過濾器會產生多個結果,例如, 生成其輸入數組的所有元素。管道過濾器 第二次運行第二過濾器,用于每個元素, 陣一般來說,用循環和迭代完成的事情 在其他語言中,只是通過將jq中的過濾器粘合在一起來完成。
# 重要的是要記住,每個過濾器都有一個輸入和一個輸出。即使是像"hello" 或 42 這樣的文字也是過濾器-它們采用輸入, 但總是產生與輸出相同的文字。的操作 聯合收割機兩個過濾器,如加法,通常提供相同的輸入, 兩者和聯合收割機組合結果。所以,你可以實現一個平均 過濾器作為add / length -將輸入數組都饋送到add 濾波器和length濾波器,然后進行除法。

	jq過濾器在JSON數據流上運行。jq的輸入是解析為空格分隔的JSON值序列, 一次一個地通過所提供的過濾器。過濾器的輸出被寫入標準輸出,作為以換行符分隔的JSON數據序列。
	最簡單和最常見的過濾器(或jq程序)是`.`, 它是恒等運算符,復制jq的輸入,處理器到輸出流。 因為 jq 處理器從輸入流讀取JSON文本, 然后漂亮的打印輸出,`.` 程序的主要用途是驗證并打印輸入。 JQ編程語言是相當豐富的,它允許的不僅僅是驗證和精美印刷。
	# 注意:注意shell的引用規則是很重要的。 作為一般來說,最好使用總是引用(單引號字符)的jq程序,因為太多的字符與特殊 jq 的含義也是shell元字符。在 jq 中使用單引號字符程序和反斜杠轉義的雙引號(\")程序舉例如下。
	Unix shell: jq '.["foo"]'
	Powershell: jq '.[\"foo\"]'
	Windows命令 shell: jq ".[\"foo\"]"
	# 注意:jq允許用戶自定義函數, 但每個 jq 程序必須有一個*表達式。

下載離線安裝包

官方 --- Download Package --- jq


安裝

# Python 解析 json 數據
pip3 install yq
# Linux 安裝
yum -y install jq
dnf -y install jq
apt-get install jq
# Mac 安裝
brew install jq
# Win 安裝 
scoop install jq

源碼包安裝

git clone --recursive https://github.com/jqlang/jq.git
cd jq
autoreconf -i
./configure
make
sudo make install

選項及含義

選項 含義
-c 壓縮為一行輸出,默認情況下,jq會漂亮地打印JSON輸出。
-r 輸出原始字符串,而非json格式字符串,【去除引號】
-M 禁用顏色, 默認終端可以強制它產生顏色
--tab 每個縮進級別使用一個制表符,而不是兩個空格
--indent n 指定給定數量的空格(不超過7)進行縮進, 默認縮進空格為 2 個
-f``/`-from-file 從文件中讀取篩選器,可使用"#"來進行注釋

JQ 程序代碼演示在線平臺

JQ Command Line --- 代碼演示在線平臺

JQ 語法

基本過濾器

身份運算符 --- .

最簡單的過濾器是`.`。 該過濾器將其輸入并產生與輸出相同的值。 就是這個是身份運算符
# 注意: jq 默認會漂亮地打印所有輸出, 一個只包含 `.` 的程序可以用來格式化 JSON輸出。類似于 curl。
代碼演示 -- 折疊
  
[root@localhost ~]# cat > dd.json << EOF
"Hello, world! 你好,世界!"
EOF
[root@localhost ~]# cat dd.json | jq '.' 
"Hello, world! 你好,世界!"
[root@localhost ~]# 
[root@localhost ~]# cat > dd.json << EOF
0.12345678901234567890123456789
EOF
[root@localhost ~]# 
[root@localhost ~]# cat dd.json | jq '.' 
0.12345678901234567890123456789

標識符-索引 --- .foo`, `.foo.bar

	最簡單且有用的過濾器類似形式 `.foo`。當給定一個 JSON對象(又名字典或哈希)作為輸入時, `.foo` 表示鍵"foo"處的值, 如果鍵不存在,則為null。
形式為.foo.bar的過濾器等效于.foo | .bar
# 注意: 鍵名是由字母、數字、下劃線組成的字符串,且開頭必須為字母或下劃線, 且不得包含中文;
代碼演示 -- 折疊
  
[root@localhost ~]# cat > dd.json << EOF 
{"_name": "fd中", "23ff": 24, "age": "dd", "sal$": 100, "結果是": true, "is": false}
EOF
[root@localhost ~]# cat dd.json | jq .age  
"dd"
[root@localhost ~]# cat dd.json | jq ._name 
"fd中"
[root@localhost ~]# cat dd.json | jq '._name' 
"fd中"
[root@localhost ~]# cat dd.json | jq '.23ff'    # 語法報錯
[root@localhost ~]# cat dd.json | jq '.結果是'   # 語法報錯
[root@localhost ~]# cat dd.json | jq ".sal$"    # 語法報錯
[root@localhost ~]# cat dd.json | jq '.is'
false

對象索引 --- .[<string>]

該語法為查找對象, 
.["foo"](上面的.foo是這個的簡寫版本,但是僅用于類似標識符的字符串)。

數組索引 --- .[<number>]

數組從 0 開始為它的每一個元素順序創建下標索引,直到總長度減一。要訪問它的某個元素,以方括號加下標值的方式即可;
允許使用負索引, -1 表示最后一個元素,-2 表示倒數第二個元素,依此類推;
代碼演示 -- 折疊
  
[root@localhost ~]# cat > ee.json << EOF 
> ["a","b","c","d","e"]
> EOF
[root@localhost ~]# cat ee.json | jq .[2]
"c"
[root@localhost ~]# cat ee.json | jq .[5]
null
[root@localhost ~]# cat ee.json | jq .[-1]
"e"

數組/字符串切片 --- .[<number>:<number>]

`[start:end]` 
切片指的是對序列進行截取,選取序列中的某一段。
以冒號分割索引,start代表起點索引,end代表結束點索引。省略start表示以0開始,省略end表示到列表的結尾。
# 注意: 區間是左閉右開的。也就是說[1:4]會截取列表的索引為1/2/3的3個元素,不會截取索引為4的元素。
如果提供的是負整數下標,則從列表的最后開始往頭部查找。例如-1表示最后一個元素,-3表示倒數第三個元素。
# 注意: 該切片過程中不可以設置步長。
代碼演示 -- 折疊
  
[root@localhost ~]# cat > ff.json << EOF 
> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> EOF
[root@localhost ~]# cat ff.json | jq .[2:5] -c  
[3,4,5]
[root@localhost ~]# cat ff.json | jq .[:5] -c  
[1,2,3,4,5]
[root@localhost ~]# cat ff.json | jq .[2:] -c  
[3,4,5,6,7,8,9,10]
[root@localhost ~]# cat ff.json | jq .[-3:] -c  
[8,9,10]
[root@localhost ~]# cat ff.json | jq .[:-3] -c  
[1,2,3,4,5,6,7]
[root@localhost ~]# cat ff.json | jq .[-1] -c  
10

數組/對象值迭代器 --- .[]

在使用 `.[index]` 即數組索引語法時, 但若是省略索引,它將迭代該數組產生一個一個的獨立的結果,而不是作為一個完整結果;
# 注意: 當數組為空時,`.[]` 的結果為  none ; 
代碼演示 -- 折疊

[root@localhost ~]# cat > ff.json << EOF 
> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> EOF
[root@localhost ~]# cat ff.json | jq .[] 
1
2
3
4
5
6
7
8
9
10  
[root@localhost ~]# cat > gg.json << EOF
[{"name":"JSON", "good":true}, {"name":"XML", "habby":[11,22,33]}]
EOF
[root@localhost ~]# cat gg.json | jq .[] -c  
{"name":"JSON","good":true}
{"name":"XML","habby":[11,22,33]}
[root@localhost ~]# cat gg.json | jq .[1].habby
[
  11,
  22,
  33
]
[root@localhost ~]# cat gg.json | jq .[1].habby[]
11
22
33

逗號 --- ,

該語法為多個過濾器之間的分隔符; 
如果兩個過濾器之間用逗號分隔, 則相同的輸入將分別進入到兩個過濾器, 而輸出也將按順序單獨輸出。 
代碼演示 -- 折疊

[root@localhost ~]# cat > hh.json << EOF 
{"foo": 42, "bar": "something else", "projects": [11,22,33,44,55]}
EOF
[root@localhost ~]# 
[root@localhost ~]# cat hh.json | jq '.foo, .bar'   
42
"something else"
[root@localhost ~]# 
[root@localhost ~]# cat hh.json | jq '.foo, .projects[]'   
42
11
22
33
44
55
[root@localhost ~]# 
[root@localhost ~]# cat hh.json | jq '.foo, .projects[0,4]'   
42
11
55

管道 --- |

該運算符通過將左邊的輸出 當做是 右邊的輸入, 類似于 Unix shell的管道符號, 作用大致一樣;
.a | . | .b 與.a.b 是等價的 
代碼演示 -- 折疊

[root@localhost ~]# cat > ii.json << EOF 
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
EOF
[root@localhost ~]# cat ii.json | jq '.[] | .name'  
"JSON"
"XML"

括號 --- ()

括號作為一個分組操作符,就像在任何典型的 編程語言;
代碼演示 -- 折疊

[root@localhost ~]# cat > jj.json << EOF 
1                                                           
EOF
[root@localhost ~]# cat jj.json | jq '(. + 2) * 5'  
15

數據類型

數組 --- []

與JSON一樣,[]用于構造數組, 索引從 0 開始,負索引從 -1 開始;
代碼演示 -- 折疊

root@localhost ~]# cat > kk.json << EOF 
> [1, 2, 3, 4, 5, 6]
> EOF
[root@localhost ~]# cat kk.json | jq '[ .[] | . * 2]' -c   
[2,4,6,8,10,12]
[root@localhost ~]# cat > ll.json << EOF 
{"con": "china", "bar": "something else", "projects": [11,22,33,44,55]}
EOF
[root@localhost ~]# cat ll.json | jq '[.con, .projects[]]' -c  
["china",11,22,33,44,55]

字典 --- {}

與JSON類似,{}用于構造對象(也稱為 字典或散列),如:{"a": 42, "b": 17}。
# 注意: 鍵名是由字母、數字、下劃線組成的字符串,且開頭必須為字母或下劃線, 且不得包含中文;
代碼演示 -- 折疊

[root@localhost ~]# cat > mm.json << EOF
> {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
> EOF
[root@localhost ~]# 
[root@localhost ~]# cat mm.json | jq '{user, title: .titles[]}'
{
  "user": "stedolan",
  "title": "JQ Primer"
}
{
  "user": "stedolan",
  "title": "More JQ"
}
[root@localhost ~]# cat mm.json | jq '{(.user): .titles}'
{
  "stedolan": [
    "JQ Primer",
    "More JQ"
  ]
}

內置運算符

內置運算符: + , - , * , / , % 
x % y計算 x 模 y

內置函數

abs     # 對于數字輸入,計算絕對值
length  # 獲取各種長度,對與不同數據類型,數組計算長度,字符串計算字符個數;
map     # 將表達式映射應用于輸入數組或對象中的每個值
del     # 刪除數組或字典中的元素
has     # 判斷返回輸入字典或列表中是否具有給定的鍵
。。。。。。  有很多和  python 中的內置函數一致; 

參考演示數據 --- suosuo.json

# 壓縮為一行數據顯示
[{"name":"suosuo","age":106,"is marry":"0","url":"http://mirrors.suosuo1930.com","salary":"100 million","address":{"city001":"* -- 沙雅","city002":"* -- 庫車","city003":"吉林 -- 長春","city004":"浙江 -- 杭州"},"commit":{"author":{"name":"itchyny","email":["it@.co.jp","it@.dd.jp","it@.cc.jp"],"date":"2023-12-19T08:54:53Z","verifi":{"verified":true,"reason":"valid"}}},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"雯雯","age":101,"is marry":"1","url":"http://www.wenwen.com","salary":"200 million","address":{"city001":"河南 -- 鄭州","city002":"河北 -- 雄安","city003":"山東 -- 曲阜","city004":"浙江 -- 嘉興"},"commit":{"author":{"name":"dependabot[bot]","email":["+depen@github.com","+depen@ee.com","+depen@ff.com"],"date":"2023-12-18T14:18:47Z","verifi":{"verified":true,"reason":"invalid"}}},"arrayBrowser":[{"name":"bing","url":"http://www.bing.com"},{"name":"Tshihua","url":"http://www.Tshihua.com"}]},{"name":"楠楠","age":99,"is marry":"0","url":"http://cn.nannan.com","salary":"300 million","address":{"city001":"* -- 阿克蘇","city002":"浙江 -- 紹興","city003":"安徽 -- 黃山","city004":"南極 -- 特拉蓋"},"commit":{"author":{"name":"github-actions[bot]","email":["+act@noreply.com","+act@gg.com","+act@hh.com"],"date":"2023-12-13T19:52:03Z","verifi":{"verified":false,"reason":"valid"}}},"arrayBrowser":[{"name":"PKU","url":"https://www.pku.edu.cn/"},{"name":"Docker","url":"https://docs.docker.com/engine/install/centos/"}]}]
# JSON	數據書寫規范
1. 字典中最后一對 key--value 對不可以加 逗號,其他對最后必須加 逗號,表示元素的分隔;
2. 列表同理,以 逗號 分隔每一個元素,且最后一個元素后不可以加 逗號

參考命令

打印

# 格式化輸出 json 數據
參考演示代碼示例 -- 折疊

root@localhost ~]# cat suosuo.json | jq .
[
    {
        "name": "suosuo",
        "age": 106,
        "is marry": "0",
        "url": "http://mirrors.suosuo1930.com",
        "salary": "100 million",
        "address": {
            "city001": "* -- 沙雅",
            "city002": "* -- 庫車",
            "city003": "吉林 -- 長春",
            "city004": "浙江 -- 杭州"
        },
        "commit": {
            "author": {
                "name": "itchyny",
                "email": [
                    "it@.co.jp",
                    "it@.dd.jp",
                    "it@.cc.jp"
                ],
                "date": "2023-12-19T08:54:53Z",
                "verifi": {
                    "verified": true,
                    "reason": "valid"
                }
            }
        },
        "arrayBrowser": [
            {
                "name": "Google",
                "url": "http://www.google.com"
            },
            {
                "name": "Baidu",
                "url": "http://www.baidu.com"
            }
        ]
    },
    {
        "name": "雯雯",
        "age": 101,
        "is marry": "1",
        "url": "http://www.wenwen.com",
        "salary": "200 million",
        "address": {
            "city001": "河南 -- 鄭州",
            "city002": "河北 -- 雄安",
            "city003": "山東 -- 曲阜",
            "city004": "浙江 -- 嘉興"
        },
        "commit": {
            "author": {
                "name": "dependabot[bot]",
                "email": [
                    "+depen@github.com",
                    "+depen@ee.com",
                    "+depen@ff.com"
                ],
                "date": "2023-12-18T14:18:47Z",
                "verifi": {
                    "verified": true,
                    "reason": "invalid"
                }
            }
        },
        "arrayBrowser": [
            {
                "name": "bing",
                "url": "http://www.bing.com"
            },
            {
                "name": "Tshihua",
                "url": "http://www.Tshihua.com"
            }
        ]
    },
    {
        "name": "楠楠",
        "age": 99,
        "is marry": "0",
        "url": "http://cn.nannan.com",
        "salary": "300 million",
        "address": {
            "city001": "* -- 阿克蘇",
            "city002": "浙江 -- 紹興",
            "city003": "安徽 -- 黃山",
            "city004": "南極 -- 特拉蓋"
        },
        "commit": {
            "author": {
                "name": "github-actions[bot]",
                "email": [
                    "+act@noreply.com",
                    "+act@gg.com",
                    "+act@hh.com"
                ],
                "date": "2023-12-13T19:52:03Z",
                "verifi": {
                    "verified": false,
                    "reason": "valid"
                }
            }
        },
        "arrayBrowser": [
            {
                "name": "PKU",
                "url": "https://www.pku.edu.cn/"
            },
            {
                "name": "Docker",
                "url": "https://docs.docker.com/engine/install/centos/"
            }
        ]
    }
]
# 需注意以下幾點: 
1. 不管是 列表 還是 字典, 在最后一個元素后不可添加 逗號 `,`;

去除引號

[root@localhost demo01]# cat suosuo.json | jq .[0] | jq .arrayBrowser[0].name
"Google"
[root@localhost demo01]# cat suosuo.json | jq .[0] | jq .arrayBrowser[0].name -r
Google

元素獲取

當一級元素并列存在2個或2個以上的字典時

[root@localhost demo01]# cat demo.json | jq .
{
  "name": "suosuo",
  "age": 200
}
{
  "name": "pingping",
  "age": 300,
  "salary": "100k"
}
[root@localhost demo01]# cat demo.json | jq .name
"suosuo"
"pingping"
[root@localhost demo01]# cat demo.json | jq .salary
null
"100k"
[root@localhost demo01]# cat demo.json | jq .dddd
null
null
  1. 匹配某一個 key 時,會在每個字典中匹配
  2. 當 key 不存在時,value 為 null

當一級元素并列存在2個或2個以上的列表時

[root@localhost demo01]# cat demo02.json | jq .
[
  "100",
  "200"
]
[
  "300",
  "400"
]
[root@localhost demo01]# cat demo02.json | jq .[0]
"100"
"300"
[root@localhost demo01]# cat demo02.json | jq .[3]
null
null
[root@localhost demo01]# cat demo02.json | jq .[-1:]
[
  "200"
]
[
  "400"
]
  1. 根據索引獲取元素時,會在每個列表中匹配
  2. 當 索引元素 不存在時,value 為 null

當一級元素為一個列表【數組】時 -- 根據索引獲取元素

[root@localhost ~]# cat suosuo.json | jq .[0]
執行結果 -- 折疊
   
{
  "name": "suosuo",
  "age": 106,
  "is marry": "0",
  "url": "http://mirrors.suosuo1930.com",
  "salary": "100 million",
  "address": {
    "city001": "* -- 沙雅",
    "city002": "* -- 庫車",
    "city003": "吉林 -- 長春",
    "city004": "浙江 -- 杭州"
  },
  "commit": {
    "author": {
      "name": "itchyny",
      "email": [
        "it@.co.jp",
        "it@.dd.jp",
        "it@.cc.jp"
      ],
      "date": "2023-12-19T08:54:53Z",
      "verifi": {
        "verified": true,
        "reason": "valid"
      }
    }
  },
  "arrayBrowser": [
    {
      "name": "Google",
      "url": "http://www.google.com"
    },
    {
      "name": "Baidu",
      "url": "http://www.baidu.com"
    }
  ]
}
1. 數組索引從 0 開始

當一級元素為一個字典時 -- 根據 Key 獲取 Value

[root@localhost ~]# cat suosuo.json | jq .[0].name  
"suosuo"
[root@localhost ~]# cat suosuo.json | jq .[0].address  
{
  "city001": "* -- 沙雅",
  "city002": "* -- 庫車",
  "city003": "吉林 -- 長春",
  "city004": "浙江 -- 杭州"
}
[root@localhost ~]# cat suosuo.json | jq .[0].address.city003  
"吉林 -- 長春"
[root@localhost ~]# cat suosuo.json | jq .[0].arrayBrowser
[
  {
    "name": "Google",
    "url": "http://www.google.com"
  },
  {
    "name": "Baidu",
    "url": "http://www.baidu.com"
  }
]
[root@localhost ~]# cat suosuo.json | jq .[0].arrayBrowser[0]
{
  "name": "Google",
  "url": "http://www.google.com"
}
[root@localhost ~]# cat suosuo.json | jq .[0].arrayBrowser[0].name  
"Google"

# 解決方法 --- 待之后解答
[root@localhost ~]# cat suosuo.json | jq .[0].arrayBrowser.[0]
jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.[0].arrayBrowser.[0]                  
jq: 1 compile error
  1. 獲取字典元素,使用 點 . 調用的方式
  2. 對于字典多層嵌套內部鍵值數據的獲取,可使用連續 點 . 調用的方式

場景代碼示例

獲取硬盤分區

sfdisk -J /dev/sda | jq .partitiontable.partitions[2].node

獲取所有硬盤設備名 --- lsblk

[root@localhost ~]# lsblk -d -n -J | jq .blockdevices[].name -r       
sda
nvme0n1
nvme0n2

獲取 Docker 容器網絡配置

[root@localhost ~]# docker inspect <容器名> | jq .[0].NetworkSettings.IPAddress -r   
172.17.0.2

高級用法示例

賦值

[root@localhost ]# cat kk.json  
{
  "name": "suosuo"
}
[root@localhost ]# jq .name="[1,3,4]" kk.json  | jq  .  
{
  "name": [
    1,
    3,
    4
  ]
}

對結果重定向

jq .name="[1,3,4]" kk.json  | jq -c  .  > jj.json  
# 轉義: 不可再重定向到自身文件,若想更新自身文件,可通過重定向到中間文件,再覆蓋到自身文件
[root@localhost ]# cat jj.json
{"name":[1,3,4]}

字典的構造

[root@localhost ~]# cat suosuo.json | jq .[0] | jq '{city002: .address.city002, reason: .commit.author.verifi.reason}'   
{
  "city002": "* -- 庫車",
  "reason": "valid"
}
# 等價于如下過濾器
[root@localhost ~]# cat suosuo.json | jq '.[0] | {city002: .address.city002, reason: .commit.author.verifi.reason}' 
{
  "city002": "* -- 庫車",
  "reason": "valid"
}

# 使用迭代器語法 
[root@localhost ~]# cat suosuo.json | jq '.[] | {city002: .address.city002, reason: .commit.author.verifi.reason}' 
{
  "city002": "* -- 庫車",
  "reason": "valid"
}
{
  "city002": "河北 -- 雄安",
  "reason": "invalid"
}
{
  "city002": "浙江 -- 紹興",
  "reason": "valid"
}

數組的構造

[root@localhost ~]# cat suosuo.json | jq '[.[] | {city002: .address.city002, reason: .commit.author.verifi.reason}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid"
  },
  {
    "city002": "河北 -- 雄安",
    "reason": "invalid"
  },
  {
    "city002": "浙江 -- 紹興",
    "reason": "valid"
  }
]
數組構造代碼示例 -- 折疊

[root@localhost ~]# cat suosuo.json | jq '[.[] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: [.commit.author.email]}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": [
      [
        "it@.co.jp",
        "it@.dd.jp",
        "it@.cc.jp"
      ]
    ]
  },
  {
    "city002": "河北 -- 雄安",
    "reason": "invalid",
    "email": [
      [
        "+depen@github.com",
        "+depen@ee.com",
        "+depen@ff.com"
      ]
    ]
  },
  {
    "city002": "浙江 -- 紹興",
    "reason": "valid",
    "email": [
      [
        "+act@noreply.com",
        "+act@gg.com",
        "+act@hh.com"
      ]
    ]
  }
]
[root@localhost ~]# 
[root@localhost ~]# cat suosuo.json | jq '[.[] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: [.commit.author.email[0]]}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": [
      "it@.co.jp"
    ]
  },
  {
    "city002": "河北 -- 雄安",
    "reason": "invalid",
    "email": [
      "+depen@github.com"
    ]
  },
  {
    "city002": "浙江 -- 紹興",
    "reason": "valid",
    "email": [
      "+act@noreply.com"
    ]
  }
]
[root@localhost ~]#
[root@localhost ~]# cat suosuo.json | jq '[.[] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: [.commit.author.email[]]}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": [
      "it@.co.jp",
      "it@.dd.jp",
      "it@.cc.jp"
    ]
  },
  {
    "city002": "河北 -- 雄安",
    "reason": "invalid",
    "email": [
      "+depen@github.com",
      "+depen@ee.com",
      "+depen@ff.com"
    ]
  },
  {
    "city002": "浙江 -- 紹興",
    "reason": "valid",
    "email": [
      "+act@noreply.com",
      "+act@gg.com",
      "+act@hh.com"
    ]
  }
]

嵌套字典的構造

[root@localhost ~]# cat suosuo.json | jq '[.[0] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: {list: .commit.author.email}}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": {
      "list": [
        "it@.co.jp",
        "it@.dd.jp",
        "it@.cc.jp"
      ]
    }
  }
]


[root@localhost ~]# cat suosuo.json | jq '[.[] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: {list: .commit.author.email}}]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": {
      "list": [
        "it@.co.jp",
        "it@.dd.jp",
        "it@.cc.jp"
      ]
    }
  },
  {
    "city002": "河北 -- 雄安",
    "reason": "invalid",
    "email": {
      "list": [
        "+depen@github.com",
        "+depen@ee.com",
        "+depen@ff.com"
      ]
    }
  },
  {
    "city002": "浙江 -- 紹興",
    "reason": "valid",
    "email": {
      "list": [
        "+act@noreply.com",
        "+act@gg.com",
        "+act@hh.com"
      ]
    }
  }
]

嵌套列表的構造

[root@localhost ~]# cat suosuo.json | jq '[.[0] | {city002: .address.city002, reason: .commit.author.verifi.reason, email: [.commit.author.email[]]}, "sfsfsf"]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "email": [
      "it@.co.jp",
      "it@.dd.jp",
      "it@.cc.jp"
    ]
  },
  "sfsfsf"
]

[root@localhost ~]# cat suosuo.json | jq '[.[0] | {city002: .address.city002, reason: .commit.author.verifi.reason}, [.commit.author.email[]]]' 
[
  {
    "city002": "* -- 庫車",
    "reason": "valid"
  },
  [
    "it@.co.jp",
    "it@.dd.jp",
    "it@.cc.jp"
  ]
]

[root@localhost ~]# cat suosuo.json | jq '[.[0] | {city002: .address.city002, reason: .commit.author.verifi.reason, age: "999"}, [.commit.author.email[]]]'   
[
  {
    "city002": "* -- 庫車",
    "reason": "valid",
    "age": "999"
  },
  [
    "it@.co.jp",
    "it@.dd.jp",
    "it@.cc.jp"
  ]
]

參考網址

JSON 在線格式化或解析平臺

官方手冊 --- jq Manual

總結

以上是生活随笔為你收集整理的Shell下处理JSON数据工具向导的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。