1. 程式人生 > 實用技巧 >給力的linux命令--jq簡易教程(轉載)

給力的linux命令--jq簡易教程(轉載)

轉載自https://www.jianshu.com/p/6de3cfdbdb0e

jq簡介

jq可以對json資料進行分片、過濾、對映和轉換,和sed、awk、grep等命令一樣,都可以讓你輕鬆地把玩文字。它能輕鬆地把你擁有的資料轉換成你期望的格式,而且需要寫的程式通常也比你期望的更加簡短。

jq是用C編寫,沒有執行時依賴,所以幾乎可以執行在任何系統上。預編譯的二進位制檔案可以直接在Linux、OS X和windows系統上執行,當然在linux和OS X系統你需要賦與其可執行許可權;在linux系統中也可以直接用yum安裝。
下載頁面:
https://stedolan.github.io/jq/download/

在知道jq命令之前,我在linux系統中極少直接去命令去處理json資料,除非只是簡單地從中過濾某個字串,那就用grep結合正則表示式來解決。所以,掌握了jq命令,則可以讓linux命令和shell指令碼在處理json資料時變得得心應手。

jq簡明教程

例子檔案
為了便於演示jq的功能,我們在檔案json.txt中儲存如下內容:

cat json.txt 
[{"name":"站長工具","url":"http://tool.chinaz.com","address":{"city":"廈門","country":"中國"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"站長之家","url":"http://tool.zzhome.com","address":{"city":"大連","country":"中國"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]

為了讓你理解檔案中的內容,對比jq的效果,在json解析工具中顯示為:

"."

最簡單的jq程式是表示式".",它不改變輸入,但可以將其優美地輸出,便於閱讀和理解。

cat json.txt | jq '.'

[
  {
    "name": "站長工具",
    "url": "http://tool.chinaz.com",
    "address": {
      "city": "廈門",
      "country": "中國"
    },
    "arrayBrowser": [
      {
        "name": "Google",
        "url": "http://www.google.com"
      },
      {
        "name": "Baidu",
        "url": "http://www.baidu.com"
      }
    ]
  },
  {
    "name": "站長之家",
    "url": "http://tool.zzhome.com",
    "address": {
      "city": "大連",
      "country": "中國"
    },
    "arrayBrowser": [
      {
        "name": "360",
        "url": "http://www.so.com"
      },
      {
        "name": "bing",
        "url": "http://www.bing.com"
      }
    ]
  }
]

[index]

輸出列表中的第一個元素,可以使用[index]:

cat json.txt | jq '.[0]'
{
  "name": "站長工具",
  "url": "http://tool.chinaz.com",
  "address": {
    "city": "廈門",
    "country": "中國"
  },
  "arrayBrowser": [
    {
      "name": "Google",
      "url": "http://www.google.com"
    },
    {
      "name": "Baidu",
      "url": "http://www.baidu.com"
    }
  ]
}

管道線|

jq支援管道線|,它如同linux命令中的管道線——把前面命令的輸出當作是後面命令的輸入。如下命令把.[0]作為{...}的輸入,進而訪問巢狀的屬性,如.name和.address.city。

觀察如下幾個命令,通過改變|前後的輸入和輸出來達到不同的效果:

cat json.txt | jq '.[0] | {name:.name,city:.address.city}'
{
  "name": "站長工具",
  "city": "廈門"
}
cat json.txt | jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'
{
  "name": "Baidu",
  "city": "廈門"
}
cat json.txt | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
{
  "name": "Baidu",
  "city": "廈門"
}
{
  "name": "bing",
  "city": "大連"
}

[]

如果希望把jq的輸出當作一個數組,可以在前後加上[]:

cat json.txt | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
[
  {
    "name": "Baidu",
    "city": "廈門"
  },
  {
    "name": "bing",
    "city": "大連"
  }
]

自定義key

在{}中,冒號前面的名字是對映的名稱,你可以任意修改,如:

cat json.txt | jq "[.[] | {name_001:.arrayBrowser[1].name,city_002:.address.city}]"
[
  {
    "name_001": "Baidu",
    "city_002": "廈門"
  },
  {
    "name_001": "bing",
    "city_002": "大連"
  }
]

擴充套件閱讀
http://www.json.cn/wiki.html
https://stedolan.github.io/jq/tutorial/