與其它編程語(yǔ)言一樣,AWK 也提供了大量的操作符。這一章節(jié)中,我們將結(jié)合例子介紹 AWK 操作符的使用方法:
AWK 支持如下的算術(shù)運(yùn)算符:
加法運(yùn)算由符號(hào) + 表示,它求得兩個(gè)或者多個(gè)數(shù)字的和。下面是一個(gè)使用示例:
[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a + b) = ", (a + b) }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
(a + b) = 70
減法運(yùn)算由符號(hào) - 表示,它求得兩個(gè)或者多個(gè)數(shù)值的差。示例如下:
[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a - b) = ", (a - b) }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
(a - b) = 30
乘法運(yùn)算由星號(hào)( * )表示,它求得兩個(gè)或者多個(gè)數(shù)值的乘積。示例如下:
[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a * b) = ", (a * b) }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
(a * b) = 1000
除法運(yùn)算由斜線( / ) 表示,它求得兩個(gè)或者兩個(gè)以上數(shù)值的商。示例如下:
[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a / b) = ", (a / b) }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
(a / b) = 2.5
模運(yùn)算由百分(%)表示,它表示兩個(gè)或者多個(gè)數(shù)進(jìn)行模除運(yùn)算得到其余數(shù)。下面是示例:
[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a % b) = ", (a % b) }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
(a % b) = 10
AWK 支持遞增運(yùn)算符與遞減運(yùn)算符:
前置遞增運(yùn)算由 ++ 表示。它將操作數(shù)加 1。這個(gè)運(yùn)算符將操作值增加 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
前置遞減運(yùn)算由 -- 表示。它的語(yǔ)義是將操作數(shù)減 1。這個(gè)運(yùn)算符先將操作數(shù)的值減 1, 再將被減小后的值返回。下面的示例中將操作數(shù) a 與 b 的值均設(shè)置為 9 :
[jerry]$ awk 'BEGIN { a = 10; b = --a; printf "a = %d, b = %d\n", a, b }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 9, b = 9
后置遞增運(yùn)算由 ++ 表示。它同樣將操作數(shù)的值加1。與前置遞增運(yùn)算符不同,它先將操作數(shù)的值返回,再將操作數(shù)的值加 1。下面的示例中會(huì)將操作數(shù) a的值設(shè)置為10,b 的值設(shè)置為11。
[jerry]$ awk 'BEGIN { a = 10; b = a++; printf "a = %d, b = %d\n", a, b }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 11, b = 10
后置遞增運(yùn)算符由 -- 表示。它同樣將操作數(shù)的值減1。該操作符先將操作數(shù)的值返回,然后將操作數(shù)減 1。下面的示例中將操作數(shù) a 的值設(shè)置為 9,b 的值設(shè)置為10?! ?/p>
[jerry]$ awk 'BEGIN { a = 10; b = a--; printf "a = %d, b = %d\n", a, b }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 9, b = 10
AWK 支持下面這些賦值操作:
簡(jiǎn)單賦值操作由 = 表示。示例如下:
[jerry]$ awk 'BEGIN { name = "Jerry"; print "My name is", name }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
My name is Jerry
加法賦值運(yùn)算符為 +=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=10; cnt += 10; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 20
上面的例子中,先給 cnt 變量賦值為 10。再使用加法賦值將 cnt 值增加 10。
減法賦值運(yùn)算符為 -=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=100; cnt -= 10; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 90
上面的例子中,先給 cnt 變量賦值為 100。再使用減法賦值運(yùn)算將 cnt 值減少 10。
乘法賦值運(yùn)算符為 *=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=10; cnt *= 10; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 100
上面的例子中,先給 cnt 變量賦值為 10。再使用乘法賦值運(yùn)算符將 cnt 值乘以 10。
除法賦值運(yùn)算符為 /=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=100; cnt /= 5; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 20
上面的例子中,先將 cnt 變量賦值為 100。再使用乘法賦值運(yùn)算符將 cnt 值除以 5?! ?/p>
模運(yùn)算賦值運(yùn)算符為 %=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=100; cnt %= 8; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 4
上面的例子中,先將 cnt 變量賦值為 10。再使用模運(yùn)算賦值操作將 cnt 值乘以 10。
指數(shù)賦值運(yùn)算符為 ^=。下面為示例:
[jerry]$ awk 'BEGIN { cnt=2; cnt ^= 4; print "Counter =", cnt }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Counter = 16
這個(gè)例子求 cnt 的四次冪。
AWK 支持如下關(guān)系運(yùn)算符:
等于運(yùn)算符為 ==。如果兩個(gè)操作數(shù)相等則返回真,否則返回假。示例如下:
awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a == b
不等于運(yùn)算符為 !=。如果兩個(gè)操作數(shù)相等則返回假,否則返回真。示例如下:
[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a != b) print "a != b" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a != b
小于運(yùn)算符為 <。如果左操作數(shù)小于右操作數(shù)據(jù)則返回真,否則返回假。示例如下:
[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a < b) print "a < b" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a < b
小于等于運(yùn)算符為 <=。如果左操作數(shù)小于或等于右操作數(shù)據(jù)則返回真,否則返回假。示例如下:
[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a <= b) print "a <= b" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a <= b
大于運(yùn)算符為 >。如果左操作數(shù)大于右操作數(shù)則返回真,否則返回假。示例如下:
[jerry]$ awk 'BEGIN { a = 10; b = 20; if (b > a ) print "b > a" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
b > a
大于等于運(yùn)算符為 >=。如果左操作數(shù)大于或等于右操作數(shù)則返回真,否則返回假。示例如下:
[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a >= b) print "a >= b" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
b >= a
AWK 包括如下邏輯運(yùn)算符:
邏輯與運(yùn)算符為 &&。下面是邏輯與運(yùn)算符的語(yǔ)法:
expr1 && expr2
如果 expr1 與 epxr2 均為真,則最終結(jié)果為真;否則為假。請(qǐng)注意,只有當(dāng) expr1 為真時(shí)才會(huì)計(jì)算 expr2 的值,若 expr1 為假則直接返回假,而不再計(jì)算 expr2 的值。下面的例子判斷給定的字符串是否是八進(jìn)制形式:
[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
邏輯或運(yùn)算符為 ||。該運(yùn)算符語(yǔ)法如下:
expr1 || expr2
如果 expr1 與 epxr2 至少其中一個(gè)為真,則最終結(jié)果為真;二者均為假時(shí)則為假。請(qǐng)注意,只有當(dāng) expr1 為假時(shí)才會(huì)計(jì)算 expr2 的值,若 expr1 為真則不會(huì)再計(jì)算 expr2 的值。示例如下:
[jerry]$ awk 'BEGIN {ch = "\n"; if (ch == " " || ch == "\t" || ch == "\n") print "Current character is whitespace." }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Current character is whitespace.
邏輯非運(yùn)算為感嘆號(hào)(!)。此運(yùn)算符語(yǔ)法如下:
! expr1
邏輯非將 expr1 的真值取反。如果 expr1 為真,則返回 0。否則返回 1。下面的示例判斷字符串是否為空:
[jerry]$ awk 'BEGIN { name = ""; if (! length(name)) print "name is empty string." }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
name is empty string.
我們可以使用三元運(yùn)算符來(lái)實(shí)現(xiàn)條件表達(dá)式。下面為其語(yǔ)法:
condition expression ? statement1 : statement2
當(dāng)條件表達(dá)式( condition expression)為真時(shí),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 支持如下幾種一元運(yùn)算符:
一元加運(yùn)算符表示為 +。它將操作數(shù)乘以 +1。
[jerry]$ awk 'BEGIN { a = -10; a = +a; print "a =", a }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = -10
一元減運(yùn)算符為 - 。它表示將操作數(shù)乘以 -1。
[jerry]$ awk 'BEGIN { a = -10; a = -a; print "a =", a }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 10
下面將介紹兩種形式的指數(shù)運(yùn)算符:
^ 運(yùn)算符對(duì)操作數(shù)執(zhí)行冪運(yùn)算。下面的示例求 10 的二次冪。
[jerry]$ awk 'BEGIN { a = 10; a = a ^ 2; print "a =", a }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 100
** 運(yùn)算符對(duì)操作數(shù)執(zhí)行冪運(yùn)算。下面的示例求 10 的二次冪。
[jerry]$ awk 'BEGIN { a = 10; a = a ** 2; print "a =", a }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
a = 100
空格 (space) 操作符可以完成兩個(gè)字符串的連接操作。示例如下:
[jerry]$ awk 'BEGIN { str1="Hello, "; str2="World"; str3 = str1 str2; print str3 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Hello, World
數(shù)組成員操作符為 in。該操作符用于訪問(wèn)數(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
下面將介紹兩種正則表達(dá)式操作符:
匹配運(yùn)算符為 ~。它用于搜索包含匹配模式字符串的域。下面的示例中將輸出包括 9 的行:
[jerry]$ awk '$0 ~ 9' marks.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
2) Rahul Maths 90
5) Hari History 89
不匹配操作符為 !~。 此操作符用于搜索不匹配指定字符串的域。如下示例輸出不包含 9 的行:
[jerry]$ awk '$0 !~ 9' marks.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
1) Amit Physics 80
3) Shyam Biology 87
4) Kedar English 85
更多建議: