鍍金池/ 教程/ Linux/ 操作符  
循環(huán)  
操作符  
優(yōu)雅地輸出
用戶自定義函數(shù)
正則表達式
基本示例
內(nèi)置函數(shù)
工作流程
概述
控制流  
數(shù)組  
輸出重定向
基本語法
運行環(huán)境
內(nèi)置變量

操作符  

與其它編程語言一樣,AWK 也提供了大量的操作符。這一章節(jié)中,我們將結(jié)合例子介紹 AWK 操作符的使用方法: 

算術(shù)運算符  

AWK 支持如下的算術(shù)運算符:  

加法運算符 

加法運算由符號 + 表示,它求得兩個或者多個數(shù)字的和。下面是一個使用示例:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a + b) = ", (a + b) }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

(a + b) =  70

 

減法運算符  

減法運算由符號 - 表示,它求得兩個或者多個數(shù)值的差。示例如下:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a - b) = ", (a - b) }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

(a - b) =  30

乘法運算符  

乘法運算由星號( * )表示,它求得兩個或者多個數(shù)值的乘積。示例如下:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a * b) = ", (a * b) }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

(a * b) =  1000

除法運算符  

除法運算由斜線( / ) 表示,它求得兩個或者兩個以上數(shù)值的商。示例如下:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a / b) = ", (a / b) }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

(a / b) =  2.5

模運算符  

模運算由百分(%)表示,它表示兩個或者多個數(shù)進行模除運算得到其余數(shù)。下面是示例:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a % b) = ", (a % b) }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

(a % b) =  10

遞增運算符與遞減運算符  

AWK 支持遞增運算符與遞減運算符:  

前置遞增運算  

前置遞增運算由 ++ 表示。它將操作數(shù)加 1。這個運算符將操作值增加 1,然后再返回增加后的值。下面的示例中,將操作數(shù) a  值增加 1 后賦值給?。狻? 最終 a 與 b 的值均為 11 :   

awk 'BEGIN { a = 10; b = ++a; printf "a = %d, b = %d\n", a, b }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

a = 11, b = 11

前置遞減運算符  

前置遞減運算由 -- 表示。它的語義是將操作數(shù)減 1。這個運算符先將操作數(shù)的值減 1, 再將被減小后的值返回。下面的示例中將操作數(shù) a 與 b 的值均設置為 9 :  

 [jerry]$ awk 'BEGIN { a = 10; b = --a; printf "a = %d, b = %d\n", a, b }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

a = 9, b = 9

后置遞增運算符   

后置遞增運算由 ++ 表示。它同樣將操作數(shù)的值加1。與前置遞增運算符不同,它先將操作數(shù)的值返回,再將操作數(shù)的值加 1。下面的示例中會將操作數(shù) a的值設置為10,b 的值設置為11。   

 [jerry]$ awk 'BEGIN { a = 10; b = a++; printf "a = %d, b = %d\n", a, b }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

a = 11, b = 10

后置遞減運算符  

后置遞增運算符由 -- 表示。它同樣將操作數(shù)的值減1。該操作符先將操作數(shù)的值返回,然后將操作數(shù)減 1。下面的示例中將操作數(shù) a 的值設置為 9,b 的值設置為10?! ?/p>

[jerry]$ awk 'BEGIN { a = 10; b = a--; printf "a = %d, b = %d\n", a, b }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

a = 9, b = 10

賦值操作符  

AWK 支持下面這些賦值操作:  

簡單賦值  

簡單賦值操作由 = 表示。示例如下:  

[jerry]$ awk 'BEGIN { name = "Jerry"; print "My name is", name }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

My name is Jerry

加法賦值  

加法賦值運算符為 +=。下面為示例:   

[jerry]$ awk 'BEGIN { cnt=10; cnt += 10; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

Counter = 20

上面的例子中,先給 cnt 變量賦值為 10。再使用加法賦值將 cnt 值增加 10。   

減法賦值  

減法賦值運算符為 -=。下面為示例:   

[jerry]$ awk 'BEGIN { cnt=100; cnt -= 10; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

Counter = 90

上面的例子中,先給 cnt 變量賦值為 100。再使用減法賦值運算將 cnt 值減少 10。

乘法賦值  

乘法賦值運算符為 *=。下面為示例:   

[jerry]$ awk 'BEGIN { cnt=10; cnt *= 10; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

Counter = 100

上面的例子中,先給 cnt 變量賦值為 10。再使用乘法賦值運算符將 cnt 值乘以 10?! ?/p>

除法賦值  

除法賦值運算符為 /=。下面為示例:  

[jerry]$ awk 'BEGIN { cnt=100; cnt /= 5; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

Counter = 20

上面的例子中,先將 cnt 變量賦值為 100。再使用乘法賦值運算符將 cnt 值除以 5?! ?/p>

模運算賦值  

模運算賦值運算符為 %=。下面為示例:   

[jerry]$ awk 'BEGIN { cnt=100; cnt %= 8; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

Counter = 4

上面的例子中,先將 cnt 變量賦值為 10。再使用模運算賦值操作將 cnt 值乘以 10。 

指數(shù)賦值  

指數(shù)賦值運算符為 ^=。下面為示例:   

[jerry]$ awk 'BEGIN { cnt=2; cnt ^= 4; print "Counter =", cnt }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

Counter = 16

這個例子求 cnt 的四次冪?! ?/p>

關(guān)系運算符   

AWK 支持如下關(guān)系運算符:  

等于  

等于運算符為 ==。如果兩個操作數(shù)相等則返回真,否則返回假。示例如下:  

awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

a == b

不等于

不等于運算符為 !=。如果兩個操作數(shù)相等則返回假,否則返回真。示例如下:  

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a != b) print "a != b" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

a != b

小于   

小于運算符為 <。如果左操作數(shù)小于右操作數(shù)據(jù)則返回真,否則返回假。示例如下:   

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a < b) print "a < b" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

a < b

小于或等于   

小于等于運算符為 <=。如果左操作數(shù)小于或等于右操作數(shù)據(jù)則返回真,否則返回假。示例如下:   

[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a <= b) print "a <= b" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

a <= b

大于  

大于運算符為 >。如果左操作數(shù)大于右操作數(shù)則返回真,否則返回假。示例如下:  

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (b > a ) print "b > a" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:   

b > a

大于或等于  

大于等于運算符為 >=。如果左操作數(shù)大于或等于右操作數(shù)則返回真,否則返回假。示例如下:  

[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a >= b) print "a >= b" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:  

b >= a

邏輯運算符 

AWK 包括如下邏輯運算符:  

邏輯與  

邏輯與運算符為 &&。下面是邏輯與運算符的語法:

expr1 && expr2

如果 expr1 與 epxr2 均為真,則最終結(jié)果為真;否則為假。請注意,只有當 expr1 為真時才會計算 expr2 的值,若 expr1 為假則直接返回真,而不再計算 expr2 的值。下面的例子判斷給定的字符串是否是十進制形式:

[jerry]$ awk 'BEGIN {num = 5; if (num >= 0 && num <= 7) printf "%d is in octal format\n", num }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

5 is in octal format

邏輯或  

邏輯或運算符為 ||。該運算符語法如下:  

expr1 || expr2

如果 expr1 與 epxr2 至少其中一個為真,則最終結(jié)果為真;二者均為假時則為假。請注意,只有當 expr1 為假時才會計算 expr2 的值,若 expr1 為真則不會再計算 expr2 的值。示例如下:

[jerry]$ awk 'BEGIN {ch = "\n"; if (ch == " " || ch == "\t" || ch == "\n") print "Current character is whitespace." }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Current character is whitespace.

邏輯非

邏輯非運算為感嘆號(!)。此運算符語法如下:

! expr1 

邏輯非將 expr1 的真值取反。如果 expr1 為真,則返回 0。否則返回 1。下面的示例判斷字符串是否為空:

[jerry]$ awk 'BEGIN { name = ""; if (! length(name)) print "name is empty string." }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

name is empty string.

三元運算符

我們可以使用三元運算符來實現(xiàn)條件表達式。下面為其語法:

condition expression ? statement1 : statement2

當條件表達式( condition expression)為真時,statement1 執(zhí)行,否則 statement2 執(zhí)行。下面的示例將返回最大數(shù)值:

[jerry]$ awk 'BEGIN { a = 10; b = 20; (a > b) ? max = a : max = b; print "Max =", max}'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Max = 20

一元運算符

AWK 支持如下幾種一元運算符:

一元加運算

一元加運算符表示為 +。它將操作數(shù)乘以 +1。

[jerry]$ awk 'BEGIN { a = -10; a = +a; print "a =", a }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

a = -10

一元減運算符

一元減運算符為 - 。它表示將操作數(shù)乘以 -1。

[jerry]$ awk 'BEGIN { a = -10; a = -a; print "a =", a }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

a = 10

指數(shù)運算符

下面將介紹兩種形式的指數(shù)運算符:

冪運算符 ^

^ 運算符對操作數(shù)執(zhí)行冪運算。下面的示例求 10 的二次冪。

[jerry]$ awk 'BEGIN { a = 10; a = a ^ 2; print "a =", a }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

a = 100

冪運算符 **

** 運算符對操作數(shù)執(zhí)行冪運算。下面的示例求 10 的二次冪。

[jerry]$ awk 'BEGIN { a = 10; a = a ** 2; print "a =", a }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

a = 100

字符串連接操作符

空格 (space) 操作符可以完成兩個字符串的連接操作。示例如下:

[jerry]$ awk 'BEGIN { str1="Hello, "; str2="World"; str3 = str1 str2; print str3 }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Hello, World

數(shù)組成員操作符

數(shù)組成員操作符為 in。該操作符用于訪問數(shù)組元素 。下面的示例用于此操作符輸出數(shù)組中所有元素。

[jerry]$ awk 'BEGIN { arr[0] = 1; arr[1] = 2; arr[2] = 3; for (i in arr) printf "arr[%d] = %d\n", i, arr[i] }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

arr[0] = 1
arr[1] = 2
arr[2] = 3

正則表達式操作符

下面將介紹兩種正則表達式操作符:

匹配(Match)

匹配運算符為 ~。它用于搜索包含匹配模式字符串的域。下面的示例中將輸出包括 9 的行:

[jerry]$ awk '$0 ~ 9' marks.txt

執(zhí)行上面的命令可以得到如下的結(jié)果:

2)  Rahul   Maths   90
5)  Hari    History 89

不匹配(Not match)

不匹配操作符為 !~。 此操作符用于搜索不匹配指定字符串的域。如下示例輸出不包含 9 的行:

[jerry]$ awk '$0 !~ 9' marks.txt

執(zhí)行上面的命令可以得到如下的結(jié)果:

1)  Amit    Physics 80
3)  Shyam   Biology 87
4)  Kedar   English 85