关系操作符和布尔操作符用于在两个表达式之间进行比较。下表列出了关系操作符。
关系操作符
运算符 | 含义 | 示例 |
---|---|---|
< | 小于 | x < y |
<= | 小于等于 | x <= y |
== | 等于 | x == y |
!= | 不等于 | x != y |
>= | 大于等于 | x >= y |
> | 大于 | x > y |
~ | 与正则表达式匹配 | x ~ /y/ |
!~ | 与正则表达式不匹配 | x !~ /y/ |
关系表达式可用在模式中来控制特殊的操作。例如,如果我们想限定要处理的记录包含5个字段,则可以用下面的表达式:
NF == 5
这个关系表达式将NF(每个输入记录的字段数)的值和5相比较。如果结果为真,那么就进行相应的处理,否则不进行处理。
注意: 关系操作符"== (相等)"和赋值操作符"= (等于)"是不同的。用"="代替"=="来检测相等性是一个经常犯的错误。
我们可以在试图打印数据库phonelist的记录之前用一个关系表达式来检测。
NF==6 { print $1,$6 }
只有具有6个字段的记录才能被打印。
和"--"相反的是"! = (不相等的)"。同样地,可以比较一个表达式是否大于(>)或小于(<),或大于等于(>=),或小于等于(<=)另一个表达式。如下的表达式:
NR > 1
检测当前记录号是否大于1,在条件表达式的一章,我们看到,关系表达式经常用在if语句中,通过计算来决定是否执行特殊的操作。
正则表达式经常用斜杠包围。这经常被作为正则表达式常量,正如"Hello"是一个字符串常量一样。我们已经看到很多这样例子:
/^$/ { print "This
is a blank line." }
然而,也常常不局限于正则表达式常量。当使用关系操作符~(匹配)或! ~ (不匹配)时,右边的表达式可以是awk中的任意表达式; awk将它作为一个字符串并用来指定一个正则表达式。
$5 ~ /MA/ { print $1 ",
"$6 }
这个语句是将第五个字段的值与正则表达式"MA"比较。
因为所有的表达式都与~口!~一起使用,因此正则表达式可以用变量来提供。例如,在脚本phonelist中,我们可以用state 来代替"/MA/" ,并编写一个过程来定义state的值。
$5 ~ state { print $1 ",
"$6}
这使得程序代码更加通用,因为在脚本执行过程中可以动态改变模式。例如,我们可以从命令行参数得到state的值,在之后的文章中我们将讨论如何将命令行参数传递给脚本。
参考资料:http://www.linuxawk.com/communication/503.html