Awk入门
完成条件
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
立即终止for
或while
循环。
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 处理 |
练习
- 打印前 10 行
NR > 10 { exit }
{ print NR, $0 }
- 跳过空行
NF == 0 { next }
{ print "Non-empty:", $0 }
在下一章,我们将学习 Awk 的文件处理(File Processing) 🚀
最后修改: 2025年01月30日 星期四 01:16