awk从入门到入土操作符

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk从入门到入土操作符相关的知识,希望对你有一定的参考价值。

学习完变量,自然是学习操作符。变量配合操作符可以实现算数运算、逻辑运算。

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

文章目录

1、算术运算符

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

1.1 加法运算符

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

$ awk 'BEGIN  a = 50; b = 20; print "(a + b) = ", (a + b) '

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

(a + b) =  70

1.2 减法运算符

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

$ awk 'BEGIN  a = 50; b = 20; print "(a - b) = ", (a - b) '

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

(a - b) =  30

1.3 乘法运算符

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

$ awk 'BEGIN  a = 50; b = 20; print "(a * b) = ", (a * b) '

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

(a * b) =  1000

1.4 除法运算符

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

$ awk 'BEGIN  a = 50; b = 20; print "(a / b) = ", (a / b) '

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

(a / b) =  2.5

1.5 模运算符

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

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

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

(a % b) =  10

2、递增运算符与递减运算符

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

2.1 前置递增运算

前置递增运算由 ++ 表示。它将操作数加 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

2.2 前置递减运算符

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

$ awk 'BEGIN  a = 10; b = --a; printf "a = %d, b = %d\\n", a, b '

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

a = 9, b = 9

2.3 后置递增运算符

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

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

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

a = 11, b = 10

2.4 后置递减运算符

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

$ awk 'BEGIN  a = 10; b = a--; printf "a = %d, b = %d\\n", a, b '

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

a = 9, b = 10

3、赋值操作符

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

3.1 简单赋值

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

$ awk 'BEGIN  name = "Jerry"; print "My name is", name '

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

My name is Jerry

3.2 加法赋值

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

$ awk 'BEGIN  cnt=10; cnt += 10; print "Counter =", cnt '

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

Counter = 20

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

3.3 减法赋值

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

$ awk 'BEGIN  cnt=100; cnt -= 10; print "Counter =", cnt '

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

Counter = 90

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

3.4 乘法赋值

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

$ awk 'BEGIN  cnt=10; cnt *= 10; print "Counter =", cnt '

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

Counter = 100

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

3.5 除法赋值

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

$ awk 'BEGIN  cnt=100; cnt /= 5; print "Counter =", cnt '

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

Counter = 20

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

3.6 模运算赋值

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

$ awk 'BEGIN  cnt=100; cnt %= 8; print "Counter =", cnt '

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

Counter = 4

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

3.7 指数赋值

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

$ awk 'BEGIN  cnt=2; cnt ^= 4; print "Counter =", cnt '

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

Counter = 16

这个例子求 cnt 的四次幂。

4、关系运算符

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

5、逻辑运算符

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.

6、三元运算符

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

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

7、指数运算符

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

幂运算符 ^

^ 运算符对操作数执行幂运算。下面的示例求 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

8、字符串连接操作符

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

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

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

Hello, World

9、数组成员操作符

数组成员操作符为 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

10、正则表达式操作符

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

匹配(Match)

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

$ awk '$0 ~ 9' marks.txt

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

2)  Rahul   Maths   90
5)  Hari    History 89

不匹配(Not match)

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

$ awk '$0 !~ 9' marks.txt

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

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

以上是关于awk从入门到入土操作符的主要内容,如果未能解决你的问题,请参考以下文章

awk从入门到入土(14)awk输出重定向

awk从入土到入门(10)awk内置函数

awk从入门到入土(21)awk脚本调试

awk从入门到入土(21)awk脚本调试

awk从入门到入土(15)awk执行外部命令

awk从入门到入土awk初次会面