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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux JQ 命令学习笔记

發(fā)布時(shí)間:2025/4/5 linux 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux JQ 命令学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ??

目錄

0. Prefice(前言)

1. Filter(過(guò)濾器)? ?

2. Options(可選項(xiàng))

3. Basic Filters(基礎(chǔ)過(guò)濾器)

4. Types And Values(數(shù)據(jù)類(lèi)型和值)

5. Builtin Operators And Functions(內(nèi)置運(yùn)算符和函數(shù))

6. Conditionals And Comparisons(條件和比較)

7. Advanced Features(高級(jí)特性)

8. 參考文檔:


0. Prefice(前言)

JQ是一個(gè)命令行工具,主要用于處理json文本。語(yǔ)法很簡(jiǎn)單,如下:

jq [options...] filter [files...]

? ? ? ? JQ可以對(duì)json文本執(zhí)行多種操作,包括選擇、遍歷、刪減等等。例如?jq ′map(.price) | add′ 表示遍歷輸入的數(shù)組,并將其中每個(gè)元素的price累加起來(lái)。默認(rèn)情況下,jq從stdin中讀取json數(shù)據(jù)流,多個(gè)數(shù)據(jù)流使用空格分隔。還有一些命令行參數(shù),主要用于控制輸出和輸出的格式,filter是jq語(yǔ)言編寫(xiě)的,主要用于操作輸入的數(shù)據(jù)。

1. Filter(過(guò)濾器)? ?

? ? ? ? filter 相當(dāng)于jq程序,有很多內(nèi)置的filter用于從對(duì)象中提取字段、或者將一個(gè)數(shù)字轉(zhuǎn)換為字符串或者其它的功能。

? ? ? ? filter 可以用不同的方式組合,比如可以通過(guò)管道將一個(gè)filter的輸出當(dāng)做另一個(gè)filter的輸入,或者收集一個(gè)filter的輸出,存到一個(gè)數(shù)組里。有些filter能夠生成多個(gè)結(jié)果,比如枚舉出json數(shù)組中的每個(gè)元素,通過(guò)管道將元素依次傳輸給第二個(gè)filter。其它語(yǔ)言中通過(guò)循環(huán)和迭代實(shí)現(xiàn)的功能在jq中可以通過(guò)組合多個(gè)filter來(lái)實(shí)現(xiàn)。

2. Options(可選項(xiàng))

--slurp/-s:

????????如果有多個(gè)json輸入流,默認(rèn)情況下,會(huì)對(duì)每個(gè)輸入執(zhí)行JQ命令,如果使用該參數(shù),則會(huì)將所有輸入放到一個(gè)數(shù)組里,然后執(zhí)行一次JQ命令。

--raw-input/-R
默認(rèn)情況下,輸入必須是json格式文本,如果使用該選項(xiàng),則將每行文本當(dāng)做一個(gè)普通的字符串。

--null-input/-n?
將null作為輸入,該選項(xiàng)忽略任何輸入,僅僅將null當(dāng)做輸入傳給filter。正如下面的例子,如果沒(méi)有null-input,這時(shí)候第一個(gè)參數(shù)是"one",因?yàn)闆](méi)有任何操作會(huì)被忽略,"inputs"表示剩余的輸入,因此第一個(gè)用例輸出"two, three",如果使用了null-input,這時(shí)候忽略的就是參數(shù)null,其余輸入就會(huì)被讀取到"inputs"里面,如示例三。

--compact-output / -c:
默認(rèn)情況下,jq 的輸出是可讀性好的格式,如果使用該選項(xiàng),則輸出則會(huì)變得緊湊。

--colour-output / -C
默認(rèn)情況下,如果輸出到stdout,是有顏色的。使用該選項(xiàng)可以強(qiáng)制輸出顏色,即便是輸出到管道或者文件中。

--monochrome-output / -M
禁止輸出顏色

--ascii-output / -a:
非ASCII字符通常當(dāng)做utf8字符輸出,使用該選項(xiàng)可以強(qiáng)制輸出ascii字符。

--raw-output / -r
如果輸出是一個(gè)字符串,默認(rèn)情況下對(duì)包含一對(duì)雙引號(hào),如果使用該選項(xiàng),則僅僅輸出字符串文本。

--arg name value
傳遞變量到j(luò)q程序里

3. Basic Filters(基礎(chǔ)過(guò)濾器)

'.'
? ?. 是最基本的過(guò)濾器,對(duì)輸出不做任何處理,原樣輸出。通常用來(lái)輸出一些可讀性強(qiáng)的格式。

.Attr
? ?Attr是JSON對(duì)象的屬性名,這個(gè)過(guò)濾器用于打印指定key的值,如果不存在對(duì)應(yīng)的key,則輸出NULL

.[]
?? ?打印數(shù)組內(nèi)容,括號(hào)內(nèi)可以指定索引或者指定范圍,索引從0開(kāi)始。


,
?? ?可以使用逗號(hào)連接多個(gè)過(guò)濾器,這種情況下,每個(gè)過(guò)濾器分別執(zhí)行,結(jié)果也會(huì)并列展示出來(lái)

|
?? ?管道符用于連接兩個(gè)過(guò)濾器,功能上類(lèi)似與Unix shell 管道,左側(cè)過(guò)濾器執(zhí)行結(jié)果會(huì)被當(dāng)做右側(cè)過(guò)濾器的輸入,如果左側(cè)過(guò)濾器產(chǎn)生多個(gè)結(jié)果,則右側(cè)過(guò)濾器會(huì)分別執(zhí)行。

4. Types And Values(數(shù)據(jù)類(lèi)型和值)

?? ?jq支持和json一致的數(shù)據(jù)集,包括數(shù)字、字符串、布爾值、數(shù)組、對(duì)象和null

數(shù)組 []
?? ?和json一樣,[]也用于構(gòu)造一個(gè)數(shù)組,數(shù)組的元素可以是任意的jq表達(dá)式,表達(dá)式的結(jié)果將會(huì)組成一個(gè)數(shù)組,可以使用[]構(gòu)造任何數(shù)組。

對(duì)象·{}
?? ?和json一樣,{}用于構(gòu)造對(duì)象,如果對(duì)象的key是大小寫(xiě)敏感的,則雙引號(hào)可以省略,值可以是任意的jq表達(dá)式(如果是復(fù)雜的表達(dá)式,還需要使用括號(hào)括起來(lái)),可以使用這個(gè)符號(hào)從輸入中選取指定的字段。如果某個(gè)表達(dá)式生成多個(gè)結(jié)果,則對(duì)象也可能生成多個(gè)。如果key被括號(hào)括起來(lái),則key也會(huì)被當(dāng)做一個(gè)表達(dá)式。

5. Builtin Operators And Functions(內(nèi)置運(yùn)算符和函數(shù))

? ? ? ? ?一些jq操作符(例如+),對(duì)根據(jù)參數(shù)的不同執(zhí)行不同的操作(比如數(shù)組、數(shù)字、字符串等)。但是jq不會(huì)執(zhí)行任何隱式的類(lèi)型轉(zhuǎn)換,如果兩個(gè)參數(shù)類(lèi)型不一致,會(huì)直接報(bào)錯(cuò)。

加號(hào) +
?? ?加號(hào)需要兩個(gè)filter,輸入會(huì)分別被過(guò)濾器執(zhí)行,輸出結(jié)果會(huì)根據(jù)過(guò)濾器結(jié)果類(lèi)型相加起來(lái)。
?? ?如果是數(shù)字,則按照算數(shù)相加。


?? ?如果是數(shù)組,則會(huì)拼接成一個(gè)大數(shù)組,


?? ?如果是字符串,則會(huì)拼接起來(lái)。


?? ?如果是對(duì)象,則對(duì)象會(huì)被合并,如果有相同的key,則以右側(cè)的過(guò)濾器中的key為最終結(jié)果。


?? ?如果有一個(gè)結(jié)果是null,則返回另一個(gè)結(jié)果。

減號(hào) -?
?? ?和算術(shù)減法類(lèi)似,減號(hào)也可以用在數(shù)組上,用于將數(shù)組1中所有在數(shù)組2中出現(xiàn)的元素刪除。

乘法*、除法 /、取余%
?? ?這些操作符只作用于數(shù)字。


length
?? ?該函數(shù)獲取不同類(lèi)型值的長(zhǎng)度。
?? ?如果是字符串,則輸出unicode代碼點(diǎn)數(shù)量。也可以使用utf8bytelength 輸出字符數(shù)量


?? ?如果是數(shù)組,則輸出數(shù)組元素個(gè)數(shù)


?? ?如果是對(duì)象,則輸出key-value 組的個(gè)數(shù)


?? ?如果是null,則為0

?

keys
?? ?如果輸入是個(gè)對(duì)象,則輸出一個(gè)包含該對(duì)象所有key的數(shù)組。


?? ?如果輸入是個(gè)數(shù)組,則輸出該數(shù)組合法的索引。

has
?? ?has函數(shù)返回一個(gè)對(duì)象是否有指定的key,或者一個(gè)數(shù)組在指定的索引上是否含有元素。

to_entries, from_entries, with_entries
?? ?這些函數(shù)在對(duì)象和包含key-value的數(shù)組中轉(zhuǎn)換,如果to_entries接受一個(gè)對(duì)象,則對(duì)于對(duì)象中每一個(gè)k:v,則輸出的數(shù)組中將包含{"key": k, "value": v}.

from_entries 正好做相反的事情,with_entries 等價(jià)于 to_entries|map(foo)|from_entries

select
?? ?select(filter),如果filter返回true,則結(jié)果與輸入一致,否則不輸出。

empty
?? ?empty不返回任何結(jié)果,包括null也不返回。

map(filter)
?? ?map是個(gè)遍歷操作,對(duì)輸出數(shù)組的每個(gè)元素執(zhí)行filter,并將輸出放到一個(gè)數(shù)組里。等價(jià)于 '.[]|filter'

?add
?? ?add函數(shù)將輸入當(dāng)做一個(gè)數(shù)組,根據(jù)數(shù)組的元素類(lèi)型執(zhí)行相應(yīng)的操作,包括累加、字符串拼接、合并等。

?range
?? ?range函數(shù)用于生成一組連續(xù)的數(shù)字,range(4;10)產(chǎn)生6個(gè)數(shù)字,從4開(kāi)始,直到10(10本身不包括在內(nèi))。生成的數(shù)組將作為獨(dú)立的輸出。

?tonumber
?? ?這是個(gè)類(lèi)型轉(zhuǎn)換函數(shù),該函數(shù)將輸入當(dāng)做數(shù)字,如果輸入不是標(biāo)準(zhǔn)的數(shù)字形式會(huì)報(bào)錯(cuò)。

tostring
?? ?同上,也是個(gè)類(lèi)型轉(zhuǎn)換函數(shù),將輸入當(dāng)做字符串。

type
?? ?該函數(shù)將輸入的類(lèi)型當(dāng)做字符串輸出,可能是null,boolean、number、string、array、object的一種。

?sort、sort_by
?? ?這是個(gè)排序函數(shù),輸入必須是數(shù)組類(lèi)型。sort_by用于根據(jù)某一個(gè)字段來(lái)排序或者基于filter,sort_by(filter)會(huì)根據(jù)filter結(jié)果來(lái)進(jìn)行排序。

group_by(.attr)
?? ?分組,類(lèi)似于mysql,將輸入當(dāng)做一個(gè)數(shù)組,指定一個(gè)屬性,具有相同值的會(huì)被分到同一個(gè)數(shù)組中。


?? ?
min, max, min_by, max_by
?? ?前兩個(gè)就是取最大值和最小值,后兩個(gè)可以根據(jù)指定屬性取。

unique
?? ?該函數(shù)輸入是一個(gè)數(shù)組,輸出一個(gè)不含重復(fù)元素的數(shù)組

reverse
?? ?函數(shù)用于將數(shù)組翻轉(zhuǎn)

contains(v)
?? ?如果輸入包含v,則該函數(shù)返回true。


recurse
?? ?該函數(shù)主要用于搜索遞歸類(lèi)型結(jié)構(gòu)數(shù)據(jù)。

字符串替換 \(x)
?? ?在一個(gè)字符串中,可以加入一個(gè)反斜杠開(kāi)頭的表達(dá)式:'\express',則這個(gè)表達(dá)式的結(jié)果將會(huì)插入到字符串中。

6. Conditionals And Comparisons(條件和比較)

== , !=
?? ?表達(dá)式==只有在兩個(gè)參數(shù)完全相等時(shí)才返回true,其他情況返回FALSE,表達(dá)式!=與之相反。

if-then-else
?? ?表達(dá)式必須明確返回true或者FALSE,如果表達(dá)式返回false或者null會(huì)被當(dāng)做false,如果返回0也是false.

>、>=、<=、<
?? ?這幾個(gè)比較運(yùn)算符和算術(shù)比較運(yùn)算符邏輯類(lèi)似,結(jié)果返回true或者false

and/or/not
?? ?布爾運(yùn)算符,這里值得注意的地方是如果有一個(gè)操作數(shù)生成了多個(gè)結(jié)果,則運(yùn)算符會(huì)針對(duì)每個(gè)結(jié)果運(yùn)算一遍。

替代運(yùn)算符 //
?? ?如果一個(gè)過(guò)濾器表達(dá)式以 a//b的形式出現(xiàn),如果a的結(jié)果不是false和null,則該過(guò)濾器結(jié)果為a的結(jié)果,否則為b表達(dá)式的結(jié)果。這個(gè)表達(dá)式對(duì)于提供默認(rèn)值非常有用。

7. Advanced Features(高級(jí)特性)

? ? ? ? ?在其它編程語(yǔ)言中,變量是不可或缺的一部分。在JQ中,變量屬于一種高級(jí)特性。在大部分語(yǔ)言里,變量是傳遞臨時(shí)數(shù)據(jù)的唯一方式,如果你要計(jì)算一個(gè)值,并且之后在其它地方還要用到,你需要使用變量來(lái)存儲(chǔ)它。為了給程序的其它函數(shù)傳遞值,你需要定義一個(gè)變量(作為函數(shù)參數(shù)等)。在jq中變量很少使用,但是也是可以定義的,主要用于定義一些標(biāo)準(zhǔn)庫(kù)(很多jq函數(shù)就是這么實(shí)現(xiàn)的,比如map和find)。
?? ?jq還有一個(gè)reduce操作,很強(qiáng)大但是使用起來(lái)需要一點(diǎn)技巧。這個(gè)操作主要用于jq內(nèi)部操作。

?? ?在jq中,我們可以使用表達(dá)式 exp as $x | .... 的方式來(lái)定義變量。對(duì)于exp生成的每一個(gè)值,都會(huì)單獨(dú)執(zhí)行后續(xù)的操作,這里的as就像一個(gè)遍歷操作。
?? ?除了定義變量外,還可以使用def 語(yǔ)法定義函數(shù)。
?? ?reduce語(yǔ)法主要用于累積表達(dá)式生成的所有結(jié)果。

8. 參考文檔:

1. 官方文檔?https://stedolan.github.io/jq/manual/

2.?https://linuxcommandlibrary.com/man/jq#assignment

總結(jié)

以上是生活随笔為你收集整理的Linux JQ 命令学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。