天天看點

awk條件語句

條件語句用于在執行操作之前做一個測試。在前面的章節中,我們看到了模式比對規則的一些示例。模式比對規則本質上就是影響輸入循環的條件表達式。在這一部分,我們主要就在action中所使用的條件語句進行探讨。條件語句以if開頭,并計算放在圓括号中的表達式。文法是:

if  (expression )

action1

[ else

action2 ]

如果條件表達式expression的值為真(非零或非空),就執行action1 。當存在else語句時,如果條件表達式的值為假(零或空) ,則執行action2。一個條件表達式可能包含算術運算符、關系操作符、或布爾操作符,這些都在awk腳本中讨論過。也許最簡單的條件表達式是測試一個變量是否非零。

if  (x ) print x

如果x是零, print語句将不執行。如果x是一個非零值,将列印x的值。也可以測試x是否等于另一個值:

if  ( x  == y  ) print x

注意, "=="是關系操作符而"="是指派操作符。我們還可以用模式比對操作符"~"來測試x是否與一個模式比對:

if  ( x ~  / [yY ] (es ) ?/  ) print x

以下是幾個補充的文法要點。如果操作時由多個語句組成的,要用一對大括号将操作括起來。

if  (expression )

  statement1

  statement2

}

awk對大括号和語句的位置沒有特殊的要求(和sed不同)。左大括号放在條件表達式後面,可以與條件表達式位于一行也可以在下一行。第一條語句可以緊跟左大括号或從下一行開始,右大括号放在最好一條語句的後面,可以與最後一條語句位于同一行也可以在下一行。在大括号的前後允許有空格或制表符。雖然沒有要求語句縮進書寫,但這樣可以改善可讀性。

右大括号和else後面的換行符是可選的。

if  ( expression ) action1

[ else action2 ]

如果在action1後面加一個分号表示結束, action1後面的換行也是可選的。

if  ( expression ) action1;  [ else action2 ]

如果在同一行上用分号分隔多個語句,同樣需要使用大括号。

在前面的文章中,我們曾看見過一段腳本用于計算學生平均成績。我們可以用一個條件來判斷某個學生是否及格。

if  ( avg  >=  65  )

    grade  =  "Pass"

else

    grade  =  "Fail"

賦給grade的值取決于表達式"avg >=65" 的計算結果是真還是假。

可以用多個條件語句來測試多個條件中的某個是否為真。例如,也許學生的成績要用字母分級表示,而不是用及格或不及格來表示。以下用一個條件結構根據學生的平均分來指定一個字母成績:

if  (avg  >=  90 ) grade  =  "A"

else  if  (avg  >=  80 ) grade  =  "B"

else  if  (avg  >=  70 ) grade  =  "C"

else  if  (avg  >=  60 ) grade  =  "D"

else grade  =  "F"

應該注意到的一個重要事情是,這種連續條件隻有當一個條件表達式計算結果為真時才停止求值,這時将跳過其他的條件。如果沒有一個條件表達式的計算結果為真,将執行最後的else部分,運作預設操作,在這種情況下為grade指派"F" 。

參考資料:http://www.linuxawk.com/communication/543.html