关系操作符和布尔表达式

关系操作符如下表:

操作符 描述
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 相等
!= 不相等
~ 匹配
!~ 不匹配

关系表达式可以用在模式中来控制特殊的操作。

布尔操作符如下表:

操作符 定义
两个竖线 逻辑或
&& 逻辑与
! 逻辑非

向脚本传递参数

在 awk 当中,可以给脚本传递参数,参数将值赋给一个变量,这个变量可以在 awk 脚本当中访问。这个变量可以放在命令行上设置,放在脚本的后面,文件名的前面。

1
$ awk 'BEGIN {print d} {print d}' d=`pwd` a.txt

命令行参数一个重要限制是它们在 BEGIN 过程中是不可以使用的。

awk 当中的条件、循环和数组

条件语句

语法如下:

1
2
3
4
5
6
7
8
9
10
if ( expression ) {
action
}
else if (expression2) {
action1
}
else {
action2
}
if (x == y) print x

条件操作符

awk 中提供的条件操作符可以在 C 语言中找到,形式如下:

1
expr ? action1 : action2

循环

while 循环语法是:

1
2
3
while (condition) {
action
}

do while 循环语法是:

1
2
3
do {
action
} while (condition)

for 循环语法如下:

1
2
3
4
5
6
7
for (set_counter; test_counter; increment_counter) {
action
}

for (i = 1; i <= 5; i++) {
print i
}

影响流控制的其他语句

在循环中还有两个语句可以影响控制流,break 和 continue。

有两个语句能影响输入循环,next 和 exit。

next 语句能够让读入下一个输入行,并且返回到脚本的底部。这可以避免对当前输入行执行其他的操作过程。

exit 语句使主输入循环退出并且将控制移到 END 规则,如果 END 存在的话。如果没有 END,或者在 END 中应用 exit 语句,则终止脚本的执行。

数组

可以用数组存储一组变量,在 awk 当中不必指明数组的大小。

1
2
array[name] = "rcx"
array[1] = "chx"

在 awk 当中,所有数组都是关联数组。数组的下标可以是字符或数字。

可以使用特殊的循环来访问关联数组的元素。

1
2
3
for(var in array) {
do action with array[var]
}

关键词 in 是一个操作符,可以用来测试一个下标是否是数组的成员。

1
item in array

如果存在则返回 1,否则返回 0。

内置函数

内置函数 split 能够将任何字符串费解到数组的元素当中去。

1
n = split(string, array, separator)

n 代表元素的个数,分解的元素存放在 array 当中。

删除数组元素如下:

1
delete array[item]

系统变量数组

awk 中提供的两个系统变量 ARGV 和 ENVIRON 是数组。

ARGV 是一个命令行参数的数组,不包括脚本本身和任何调用 awk 指定的选项,这个数组元素的个数可以从 ARGC 获得。数组第一个元素的下标是 0。

ENVIRON 是一个环境变量数组,数组中每一个元素是当前环境变量的值,下标是环境变量的名字。

【参考资料】

  1. sed与awk

—EOF—