awk [ options ] [ -- ] program-text file ...
options即選項(xiàng);program-text即awk代碼;file ...即待處理的讀入數(shù)據(jù),可以是文件也可以是標(biāo)準(zhǔn)輸入,只要是數(shù)據(jù)來(lái)源即可。
這里比較陌生的是[ -- ],中括號(hào)表示可以省略,在解釋“--”含義之前我們先來(lái)闡述一下一個(gè)bash下命令的選項(xiàng)和參數(shù)。
cmd -x -u root -ppassword a.txt b.txt c.txt
而前文所述的“--”用來(lái)標(biāo)識(shí)選項(xiàng)到此結(jié)束(類(lèi)似于用來(lái)標(biāo)識(shí)文件結(jié)束的EOF標(biāo)識(shí)),后面的字符均理解為非選項(xiàng)型參數(shù)(在這里即包含了awk代碼和文件)。
由于選項(xiàng)一般都會(huì)包含中劃線(xiàn)“-”,因此如果非選項(xiàng)型參數(shù)包含了這個(gè)字符,那么bash就很難理解其到底是一個(gè)選項(xiàng)還是一個(gè)非選項(xiàng)型參數(shù)。下面就是一個(gè)好的例子。
[root@c7-server ~]# grep "-v" test.txt
^C
[root@c7-server ~]# grep -- "-v" test.txt
abc-vabc
如果文件名包含了“-”,也可以使用該功能避免歧義。
講完了命令行結(jié)構(gòu)接下來(lái)我們來(lái)看看語(yǔ)法結(jié)構(gòu)。由雙引號(hào)包裹的awk代碼中包含著諸多如下的語(yǔ)法結(jié)構(gòu):
pattern{action}
我們稱(chēng)其為規(guī)則(rule)。pattern(模式)是表達(dá)式,返回布爾值的條件判斷,返回真的時(shí)候我們才執(zhí)行{}中的action(動(dòng)作)。action一般會(huì)對(duì)每次讀入的數(shù)據(jù)進(jìn)行操作,不過(guò)不是強(qiáng)制,純看action是怎么寫(xiě)的。
awk 'BEGIN{n=3} ($4<=18){print "teen"} /Alice/{print "Alice"} END{print "hello"}' a.txt
pattern和action都可以省略,不同的省略組合搭配有不同的效果。
省略pattern:會(huì)使得每次讀入的數(shù)據(jù)都滿(mǎn)足執(zhí)行action的條件。(有一些此前見(jiàn)過(guò)的結(jié)果或者隨著博客的深入慢慢一眼就可以看出結(jié)果的,我就不再寫(xiě)入博客了。)
~]# awk '{print $0}' a.txt
省略{action}:等價(jià)于{print},再等價(jià)于{print $0}。
~]# awk '/Alice/' a.txt
2 Alice female 24 def@gmail.com 18084925203
僅省略action但是保留大括號(hào):等價(jià)于空action,對(duì)于滿(mǎn)足條件的數(shù)據(jù)咱啥也不干。
[root@c7-server ~]# awk '/Alice/{}' a.txt
[root@c7-server ~]#
省略pattern+省略{action},即只剩倆單引號(hào)了:這并不會(huì)輸出每次讀入的數(shù)據(jù)而是啥也不干。
[root@c7-server ~]# awk '' a.txt
[root@c7-server ~]#
rule即pattern{action}的組合可以有多個(gè),每次讀入的數(shù)據(jù)都會(huì)按照rule的出現(xiàn)順序(CLI中從左往右,代碼文件中從上往下)依次判斷執(zhí)行。同一個(gè)pattern代碼塊內(nèi)的多個(gè)action在CLI中使用分號(hào)分隔,在代碼文件中如果有換行則不需要使用分號(hào)分隔,否則需要。
pattern簡(jiǎn)述如下,而action有許許多多的指令,它們都會(huì)隨著博客的深入會(huì)慢慢遇到。
# 特殊pattern
BEGIN{}
END{}
# 布爾值pattern
/REGEXP/ # 正則匹配
relational expression # 等值比較 3>2{action}
pattern && pattern # 邏輯與
pattern || pattern # 邏輯或
! pattern # 邏輯取反
(pattern) # 優(yōu)先級(jí)置頂
pattern?pattern:pattern # 條件表達(dá)式(三目運(yùn)算符)
# 非布爾值pattern
pattern1,pattern2 # 范圍pattern,也稱(chēng)之為flip-flop
聯(lián)系客服