linux jq常用操作


轉載自:Huang Huang 的博客 

https://mozillazg.com/2018/01/jq-use-examples-cookbook.html

jq 常用操作

jq 是個非常強大的處理 JSON 數據的命令行工具。這里記錄一下最近使用 jq 所使用的一些操作,方便以后有類似需求的時候直接參考。

基本操作

jq 的命令行使用方法如下:

$ jq -h
jq - commandline JSON processor [version 1.5] Usage: jq [options] <jq filter> [file...] 

本文主要講的是常用的 <jq filter> 。大部分操作可以通過 jq play 直接在線測試。

輸出原始的 JSON 數據

默認不指定 filter 就會原樣輸出,也可以使用 . 過濾器

.

$ echo '{"url": "mozillazg.com"}' |jq . { "url": "mozillazg.com" } 

jq play 在線運行鏈接:https://jqplay.org/s/KhRuUFCP2h

object 操作

獲取某個 key 的值

.key.foo.bar.["key"]

$ echo '{"url": "mozillazg.com"}' |jq .url "mozillazg.com" $ echo '{"url": "mozillazg.com"}' | jq '.["url"]' "mozillazg.com" 

jq play: https://jqplay.org/s/Tn7NUbP4Dr

可以在后面加個問號表示當輸入不是 object 時不會報錯 .key? :

$ echo '1' |jq '.a' jq: error (at <stdin>:1): Cannot index number with string "a" $ echo '1' |jq '.a?' $ 

? 規則適合所有正確的 filter,在 filter 最后加上 ? 可以忽略錯誤信息

所有的 key 組成的數組

keys

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq keys [ "name", "url" ] 

jq play: https://jqplay.org/s/_5KiPRS75r

所有的 value

.[]

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq .[] "mozillazg.com" "mozillazg" 

jq play: https://jqplay.org/s/6HRvEND8AB

所有的 value 組成的數組

[.[]]

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq [.[]] [ "mozillazg.com", "mozillazg" ] 

jq play: https://jqplay.org/s/JGIX6hTt_8

數組操作

取出所有元素

.[]

$ echo '[{"name": "tom"}, {"name": "mozillazg"}]' |jq .[] { "name": "tom" } { "name": "mozillazg" } 

jq play: https://jqplay.org/s/Y9UgK_4xxE

切分(slice)

.[1].[0:2]

$ echo '[{"name": "tom"}, {"name": "mozillazg"}, {"name": "jim"}]' |jq .[1] { "name": "mozillazg" } $ echo '[{"name": "tom"}, {"name": "mozillazg"}, {"name": "jim"}]' |jq .[0:2] [ { "name": "tom" }, { "name": "mozillazg" } ] 

jq play: https://jqplay.org/s/seNL7hW38W

操作 object 組成的數組

比如取出數組元素中 name 的值:

$ echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq .[].name "foo" "bar" "foobar" 

jq play: https://jqplay.org/s/Z5qjhJnRyn

也可以用下面會提到的管道操作:

$ echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq '.[]|.name' "foo" "bar" "foobar" 

如果要將結果重新組成數組,可以這樣:

$ echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq [.[].name] [ "foo", "bar", "foobar" ] 

也可以使用下面會提到的 map:

$ echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq 'map(.name)' [ "foo", "bar", "foobar" ] 

使用多個 filter

,

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '.url, .name' "mozillazg.com" "mozillazg" 

jq play: https://jqplay.org/s/02CPHO1ESj

高級操作

管道(對處理后的結果做二次或多次處理)

可以通過 | 實現類似管道的功能:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '.|.url' "mozillazg.com" 

jq play: https://jqplay.org/s/L5bu1ovLr-

$ echo '{"url": "mozillazg.com", "tests": [{"foobar": "v1"}, {"foobar": "v2"}]}' |jq '.tests |.[] |.foobar' "v1" "v2" 

jq play: https://jqplay.org/s/9UcLXKEgaT

也可以直接用 shell 的 | 實現:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '.' | jq '.url' "mozillazg.com" $ echo '{"url": "mozillazg.com", "tests": [{"foobar": "v1"}, {"foobar": "v2"}]}' |jq '.tests' | jq '.[]' | jq '.foobar' "v1" "v2" 

獲取內容的長度(字符串,數組的長度)

length 可以獲取字符串或數組的長度:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '.url|length' 13 $ echo '["mozillazg.com", "mozillazg"]' |jq '.|length' 2 

jq play: https://jqplay.org/s/9TqdXbe0lo

map

map(foo) 可以實現對數組的每一項進行操作,然后合並結果的功能:

$ echo '["mozillazg.com", "mozillazg"]' | jq 'map(length)' [ 13, 9 ] 

jq play: https://jqplay.org/s/BjgdGsjPem

filter(select)

select(foo) 可以實現對輸入項進行判斷,只返回符合條件的項:

$ echo '["mozillazg.com", "mozillazg"]' | jq 'map(select(.|length > 9))' [ "mozillazg.com" ] 

jq play: https://jqplay.org/s/8Zrwy7dDxW

字符串插值,拼接

可以使用 \(foo) 實現字符串插值功能:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '"hi \(.name)"' "hi mozillazg" 

注意要用雙引號包圍起來,表示是一個字符串。

jq play: https://jqplay.org/s/k90JFcDqPz

使用 + 實現字符串拼接:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '"hi " + .name' "hi mozillazg" 

輸出字符串原始值而不是字符串 JSON 序列化后的值

使用 -r 選項輸出字符串原始值而不是 json 序列化后的值:

$ echo '{"value": "{\"url\": \"mozillazg.com\"}"}' |jq .value "{\"url\": \"mozillazg.com\"}" echo '{"value": "{\"url\": \"mozillazg.com\"}"}' |jq -r .value {"url": "mozillazg.com"} 

if/elif/else

可以使用 if .. then .. elif .. then .. else .. end 實現條件判斷:

$ echo '[0, 1, 2, 3]' \ | jq 'map(if . == 0 then "zero" elif . == 1 then "one" elif . == 2 then "two" else "many" end)' [ "zero", "one", "two", "many" ] 

jq play: https://jqplay.org/s/y8WwvHISH4

構造 object 或數組

可以通過 {} 和 [] 構造新的 object 或 數組。

object:

$ echo '["mozillazg.com", "mozillazg"]' |jq '{name: .[1]}' { "name": "mozillazg" } 

jq play: https://jqplay.org/s/sccwJi75jb

數組:

$ echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '[.name, .url]' [ "mozillazg", "mozillazg.com" ] 

jq play: https://jqplay.org/s/LYflwM4kJM

$ echo '{"name": "mozillazg", "ages": [1, 2]}' | jq '{name, age: .ages[]}' { "name": "mozillazg", "age": 1 } { "name": "mozillazg", "age": 2 } 

jq play: https://jqplay.org/s/s1GiNkp_Ed

數組 join

join:

$ echo '["mozillazg.com", "mozillazg"]' | jq '.|join(" | ")' "mozillazg.com | mozillazg" 

jq play: https://jqplay.org/s/1ckAfiLKA3

字符串 split

split:

$ echo '"mozillazg.com | mozillazg"' |jq 'split(" | ")' [ "mozillazg.com", "mozillazg" ] 

jq play: https://jqplay.org/s/_7uGMWvmUh

更多的函數和用法詳見 官方文檔

參考資料

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM