Awk 控制结构(Control Structures)

Awk 支持类似 C 语言的 控制结构,包括:

  • if ... else 条件语句
  • while 循环
  • for 循环
  • break(跳出循环)
  • continue(跳过当前循环)

此外,Awk 还有一些不同于 C 语言的控制结构:

  • for (x in array) —— 遍历数组
  • next —— 跳过当前行,读取下一行
  • exit —— 立即终止 Awk 处理,执行 END 代码块

1. if ... else 条件语句

语法:

if (条件) 语句1 [else 语句2]
  • else 可选,用于执行 if 条件为 false 时的操作。
  • 条件 可以是 关系表达式正则匹配布尔表达式

示例:交通信号灯

{
   if ($1 == "green") 
       print "GO";
   else if ($1 == "yellow") 
       print "SLOW DOWN";
   else if ($1 == "red") 
       print "STOP";
   else 
       print "UNKNOWN SIGNAL";
}

测试命令

echo "red" | awk -f traffic.awk

输入:

green
yellow
red
blue

输出:

GO
SLOW DOWN
STOP
UNKNOWN SIGNAL

说明

  • if 语句的 代码块用 {} 包围,可以包含多个语句。
  • if ... else 不需要 ;,但单行代码时可以使用。

2. while 循环

语法:

while (条件) { 语句 }
  • while 语句会先检查条件,如果条件为 true,则执行代码块;否则终止循环。
  • 适用于 循环次数不确定的情况

示例:打印 1-20

BEGIN {
    x = 0
    while (x < 20) {
        x++
        print x
    }
}

输出:

1
2
3
...
20

3. for 循环

3.1 经典 for 语法

语法:

for (初始化; 条件; 更新) { 语句 }

示例:打印 10 到 20,步长为 2

BEGIN {
    for (i = 10; i <= 20; i += 2)
        print i
}

输出:

10
12
14
16
18
20

等价 while 版本

BEGIN {
    i = 10
    while (i <= 20) {
        print i
        i += 2
    }
}

3.2 for ... in 遍历数组

语法:

for (变量 in 数组) { 语句 }

示例:遍历 split() 生成的数组

BEGIN {
    my_string = "joe:frank:harry:bill:bob:sil"
    split(my_string, names, ":")
    
    for (idx in names)
        print idx, names[idx]
}

输出(顺序可能不同):

1 joe
2 frank
3 harry
4 bill
5 bob
6 sil

说明

  • for (x in array) 遍历数组 array,但遍历顺序是不确定的
  • 如果需要按索引排序,可以使用 asorti()

4. 无条件控制语句

语句 作用
break 跳出循环
continue 跳过本次循环,进入下一次
next 读取下一行,不执行后续代码
exit 终止 Awk 处理,并执行 END 代码块

4.1 break - 终止循环

示例:找到大于 50 的数并终止

BEGIN {
    for (i = 1; i <= 100; i++) {
        print i
        if (i > 50) 
            break
    }
}

输出:

1
2
...
50
51

说明

  • break 立即终止 forwhile 循环

4.2 continue - 跳过当前循环

示例:打印 1-10,跳过偶数

BEGIN {
    for (i = 1; i <= 10; i++) {
        if (i % 2 == 0) 
            continue
        print i
    }
}

输出:

1
3
5
7
9

说明

  • continue 跳过当前循环的剩余部分,直接进入下一次循环

4.3 next - 读取下一行

示例:跳过以 # 开头的注释行

{
    if ($1 ~ /^#/) 
        next  # 直接处理下一行
    print "Processing:", $0
}

输入:

# This is a comment
hello world
# Another comment
awk script

输出:

Processing: hello world
Processing: awk script

说明

  • next 立即读取下一行,不执行后续代码

4.4 exit - 立即终止 Awk

示例:只处理前 5 行

{
    print "Processing:", $0
    if (NR == 5) 
        exit
}

输入:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

输出:

Processing: Line 1
Processing: Line 2
Processing: Line 3
Processing: Line 4
Processing: Line 5

说明

  • exit 立即终止 Awk 处理,并执行 END 代码块(如果有)。

总结

结构 语法 作用
if ... else if (条件) { 代码 } else { 代码 } 条件判断
while while (条件) { 代码 } 条件成立时循环
for for (初始化; 条件; 更新) { 代码 } 计数循环
for ... in for (变量 in 数组) { 代码 } 遍历数组(无序)
break break; 终止循环
continue continue; 跳过当前循环
next next; 读取下一行
exit exit; 终止 Awk 处理

练习

  1. 打印前 10 行
NR > 10 { exit }
{ print NR, $0 }
  1. 跳过空行
NF == 0 { next }
{ print "Non-empty:", $0 }

在下一章,我们将学习 Awk 的文件处理(File Processing) 🚀

最后修改: 2025年01月30日 星期四 01:16