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