Awk 入门/控制结构
外观
< Awk 入门
Awk 支持类似于 C 中使用的控制结构,包括
if ... else
while
for
break
continue
还有一些与 C 中不同的控制结构
for (x in a)
- 数组循环next
- 转到下一个输入记录exit
- 停止处理输入文件,执行 END 操作(如果指定),然后结束。
"if ... else" 的语法为
if (<condition>) <action 1> [else <action 2>]
"else" 子句是可选的。 "condition" 可以是模式匹配部分中讨论的任何表达式,包括与正则表达式的匹配。 例如,考虑以下 Awk 程序
{ if ($1=="green") print "GO"; else if ($1=="yellow") print "SLOW DOWN"; else if ($1=="red") print "STOP"; else print "SAY WHAT?"; }
(在这里,分号是可选的,可以省略。)
顺便说一下,为了测试目的,这个程序可以调用为
echo "red" | awk -f pgm.txt
—其中 "pgm.txt" 是包含该程序的文本文件。
"action" 子句可以包含多个语句,用花括号 ("{}") 括起来。
"while" 的语法为
while (<condition>) <action>
只要 "condition" 测试为真, "action" 就执行,并且
"condition" 在每次迭代之前进行测试。 条件与 "if ... else" 结构中的条件相同。 例如,由于默认情况下 Awk 变量的值为 0,因此以下 Awk 程序可以打印从 1 到 20 的数字
BEGIN {x=0; while(x<=20) {++x; print x}}
- "for" 循环更灵活。 它的语法是
for (<initial action>;<condition>;<end-of-loop action>) <action>
例如,以下 "for" 循环以 2 为增量打印数字 10 到 20
BEGIN {for (i=10; i<=20; i+=2) print i}
这相当于
i=10 while (i<=20) { print i i+=2 }
C 编程语言有类似的 "for" 结构,一个有趣的特性是,只需用逗号分隔操作,就可以在初始化和循环结束操作中执行多个操作。 不幸的是,大多数 Awk 实现不支持此功能。
"for" 循环有一个备用语法,用于扫描数组
for (<variable> in <array>) <action>
给定前面使用的示例
my_string = "joe:frank:harry:bill:bob:sil"; split(my_string, names, ":");
—那么可以使用以下语句打印名称
for (idx in names) print idx, names[idx];
这将产生
2 frank 3 harry 4 bill 5 bob 6 sil 1 joe
请注意,这些名称没有按正确顺序打印。 这种 "for" 循环的一个特点是,数组不是以可预测的顺序扫描的。
Awk 定义了四个无条件控制语句:break
、continue
、next
和 exit
。
语句 break
和 continue
严格地与 while
和 for
循环相关联
- break: 导致跳出循环。
- continue: 强制执行循环的下一轮迭代。
语句 next
和 exit
控制 Awk 的输入扫描
- next: 导致 Awk 立即获取另一行输入并从第一个匹配语句开始扫描。
- exit: 导致 Awk 停止读取其输入,执行 END 操作(如果指定),然后结束。