阅读(4682) (0)

AWK 操作符

2016-08-12 21:30:13 更新

操作符  

与其它编程语言一样,AWK 也提供了大量的操作符。这一章节中,我们将结合例子介绍 AWK 操作符的使用方法: 

算术运算符  

AWK 支持如下的算术运算符:  

加法运算符 

加法运算由符号 + 表示,它求得两个或者多个数字的和。下面是一个使用示例:

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

执行上面的命令可以得到如下的结果:

(a + b) =  70

 

减法运算符  

减法运算由符号 - 表示,它求得两个或者多个数值的差。示例如下:

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

执行上面的命令可以得到如下的结果:

(a - b) =  30

乘法运算符  

乘法运算由星号( * )表示,它求得两个或者多个数值的乘积。示例如下:

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

执行上面的命令可以得到如下的结果:  

(a * b) =  1000

除法运算符  

除法运算由斜线( / ) 表示,它求得两个或者两个以上数值的商。示例如下:

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

执行上面的命令可以得到如下的结果:

(a / b) =  2.5

模运算符  

模运算由百分(%)表示,它表示两个或者多个数进行模除运算得到其余数。下面是示例:

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

执行上面的命令可以得到如下的结果:  

(a % b) =  10

递增运算符与递减运算符  

AWK 支持递增运算符与递减运算符:  

前置递增运算  

前置递增运算由 ++ 表示。它将操作数加 1。这个运算符将操作值增加 1,然后再返回增加后的值。下面的示例中,将操作数 a  值增加 1 后赋值给 b , 最终 a 与 b 的值均为 11 :   

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

执行上面的命令可以得到如下的结果:  

a = 11, b = 11

前置递减运算符  

前置递减运算由 -- 表示。它的语义是将操作数减 1。这个运算符先将操作数的值减 1, 再将被减小后的值返回。下面的示例中将操作数 a 与 b 的值均设置为 9 :  

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

执行上面的命令可以得到如下的结果:  

a = 9, b = 9

后置递增运算符   

后置递增运算由 ++ 表示。它同样将操作数的值加1。与前置递增运算符不同,它先将操作数的值返回,再将操作数的值加 1。下面的示例中会将操作数 a的值设置为10,b 的值设置为11。   

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

执行上面的命令可以得到如下的结果:  

a = 11, b = 10

后置递减运算符  

后置递增运算符由 -- 表示。它同样将操作数的值减1。该操作符先将操作数的值返回,然后将操作数减 1。下面的示例中将操作数 a 的值设置为 9,b 的值设置为10。  

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

执行上面的命令可以得到如下的结果:   

a = 9, b = 10

赋值操作符  

AWK 支持下面这些赋值操作:  

简单赋值  

简单赋值操作由 = 表示。示例如下:  

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

执行上面的命令可以得到如下的结果:   

My name is Jerry

加法赋值  

加法赋值运算符为 +=。下面为示例:   

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

执行上面的命令可以得到如下的结果:   

Counter = 20

上面的例子中,先给 cnt 变量赋值为 10。再使用加法赋值将 cnt 值增加 10。   

减法赋值  

减法赋值运算符为 -=。下面为示例:   

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

执行上面的命令可以得到如下的结果:   

Counter = 90

上面的例子中,先给 cnt 变量赋值为 100。再使用减法赋值运算将 cnt 值减少 10。

乘法赋值  

乘法赋值运算符为 *=。下面为示例:   

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

执行上面的命令可以得到如下的结果:   

Counter = 100

上面的例子中,先给 cnt 变量赋值为 10。再使用乘法赋值运算符将 cnt 值乘以 10。  

除法赋值  

除法赋值运算符为 /=。下面为示例:  

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

执行上面的命令可以得到如下的结果:  

Counter = 20

上面的例子中,先将 cnt 变量赋值为 100。再使用乘法赋值运算符将 cnt 值除以 5。  

模运算赋值  

模运算赋值运算符为 %=。下面为示例:   

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

执行上面的命令可以得到如下的结果:   

Counter = 4

上面的例子中,先将 cnt 变量赋值为 10。再使用模运算赋值操作将 cnt 值乘以 10。 

指数赋值  

指数赋值运算符为 ^=。下面为示例:   

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

执行上面的命令可以得到如下的结果:  

Counter = 16

这个例子求 cnt 的四次幂。  

关系运算符   

AWK 支持如下关系运算符:  

等于  

等于运算符为 ==。如果两个操作数相等则返回真,否则返回假。示例如下:  

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

执行上面的命令可以得到如下的结果:  

a == b

不等于

不等于运算符为 !=。如果两个操作数相等则返回假,否则返回真。示例如下:  

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

执行上面的命令可以得到如下的结果:  

a != b

小于   

小于运算符为 <。如果左操作数小于右操作数据则返回真,否则返回假。示例如下:   

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

执行上面的命令可以得到如下的结果:   

a < b

小于或等于   

小于等于运算符为 <=。如果左操作数小于或等于右操作数据则返回真,否则返回假。示例如下:   

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

执行上面的命令可以得到如下的结果:   

a <= b

大于  

大于运算符为 >。如果左操作数大于右操作数则返回真,否则返回假。示例如下:  

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

执行上面的命令可以得到如下的结果:   

b > a

大于或等于  

大于等于运算符为 >=。如果左操作数大于或等于右操作数则返回真,否则返回假。示例如下:  

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

执行上面的命令可以得到如下的结果:  

b >= a

逻辑运算符 

AWK 包括如下逻辑运算符:  

逻辑与  

逻辑与运算符为 &&。下面是逻辑与运算符的语法:

expr1 && expr2

如果 expr1 与 epxr2 均为真,则最终结果为真;否则为假。请注意,只有当 expr1 为真时才会计算 expr2 的值,若 expr1 为假则直接返回假,而不再计算 expr2 的值。下面的例子判断给定的字符串是否是八进制形式:

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

执行上面的命令可以得到如下的结果:

5 is in octal format

逻辑或  

逻辑或运算符为 ||。该运算符语法如下:  

expr1 || expr2

如果 expr1 与 epxr2 至少其中一个为真,则最终结果为真;二者均为假时则为假。请注意,只有当 expr1 为假时才会计算 expr2 的值,若 expr1 为真则不会再计算 expr2 的值。示例如下:

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

执行上面的命令可以得到如下的结果:

Current character is whitespace.

逻辑非

逻辑非运算为感叹号(!)。此运算符语法如下:

! expr1 

逻辑非将 expr1 的真值取反。如果 expr1 为真,则返回 0。否则返回 1。下面的示例判断字符串是否为空:

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

执行上面的命令可以得到如下的结果:

name is empty string.

三元运算符

我们可以使用三元运算符来实现条件表达式。下面为其语法:

condition expression ? statement1 : statement2

当条件表达式( condition expression)为真时,statement1 执行,否则 statement2 执行。下面的示例将返回最大数值:

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

执行上面的命令可以得到如下的结果:

Max = 20

一元运算符

AWK 支持如下几种一元运算符:

一元加运算

一元加运算符表示为 +。它将操作数乘以 +1。

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

执行上面的命令可以得到如下的结果:

a = -10

一元减运算符

一元减运算符为 - 。它表示将操作数乘以 -1。

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

执行上面的命令可以得到如下的结果:

a = 10

指数运算符

下面将介绍两种形式的指数运算符:

幂运算符 ^

^ 运算符对操作数执行幂运算。下面的示例求 10 的二次幂。

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

执行上面的命令可以得到如下的结果:

a = 100

幂运算符 **

** 运算符对操作数执行幂运算。下面的示例求 10 的二次幂。

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

执行上面的命令可以得到如下的结果:

a = 100

字符串连接操作符

空格 (space) 操作符可以完成两个字符串的连接操作。示例如下:

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

执行上面的命令可以得到如下的结果:

Hello, World

数组成员操作符

数组成员操作符为 in。该操作符用于访问数组元素 。下面的示例用于此操作符输出数组中所有元素。

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

执行上面的命令可以得到如下的结果:

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

正则表达式操作符

下面将介绍两种正则表达式操作符:

匹配(Match)

匹配运算符为 ~。它用于搜索包含匹配模式字符串的域。下面的示例中将输出包括 9 的行:

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

执行上面的命令可以得到如下的结果:

2)  Rahul   Maths   90
5)  Hari    History 89

不匹配(Not match)

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

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

执行上面的命令可以得到如下的结果:

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