跳转至内容

Awk 入门/控制结构

来自维基教科书,开放的书籍,开放的世界

Awk 支持类似于 C 中使用的控制结构,包括

  • if ... else
  • while
  • for
  • break
  • continue

还有一些与 C 中不同的控制结构

  • for (x in a) - 数组循环
  • next - 转到下一个输入记录
  • exit - 停止处理输入文件,执行 END 操作(如果指定),然后结束。

if ... else

[编辑 | 编辑源代码]

"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 定义了四个无条件控制语句:breakcontinuenextexit

语句 breakcontinue 严格地与 whilefor 循环相关联

  • break: 导致跳出循环。
  • continue: 强制执行循环的下一轮迭代。

语句 nextexit 控制 Awk 的输入扫描

  • next: 导致 Awk 立即获取另一行输入并从第一个匹配语句开始扫描。
  • exit: 导致 Awk 停止读取其输入,执行 END 操作(如果指定),然后结束。
华夏公益教科书