网站搜索

如何在 Awk 中使用流量控制语句 - 第 12 部分


当您从 Awk 系列一开始回顾我们迄今为止介绍的所有 Awk 示例时,您会注意到各个示例中的所有命令都是按顺序执行的,即一个接一个。但在某些情况下,我们可能希望根据某些条件运行一些文本过滤操作,这就是流程控制语句的方法发挥作用的地方。

Awk 编程中有各种流程控制语句,包括:

  1. if-else 语句
  2. 对于声明
  3. while 语句
  4. do while 语句
  5. 中断语句
  6. 继续声明
  7. 下一个声明
  8. 下一个文件语句
  9. 退出声明

然而,对于本系列的范围,我们将阐述:if-elseforwhiledo while 语句。请记住,我们已经在本 Awk 系列的第 6 部分中介绍了如何使用 next 语句。

1. if-else 语句

if 语句 的预期语法与 shell if 语句 的语法类似:

if  (condition1) {
     actions1
}
else {
      actions2
}

在上面的语法中,condition1condition2是Awk表达式,actions1actions2是当满足各自的条件。

条件1满足时,即为真,则执行actions1并退出if语句,否则actions2被执行。

if 语句 还可以扩展为 if-else_if-else 语句,如下所示:

if (condition1){
     actions1
}
else if (conditions2){
      actions2
}
else{
     actions3
}

对于上面的形式,如果条件1为真,则执行actions1并且退出if语句,否则条件2被评估,如果为 true,则执行 actions2 并且退出 if 语句。然而,当condition2为假时,actions3被执行并且if语句退出。

这是使用 if 语句的一个例子,我们有一个用户列表及其年龄存储在文件中,用户.txt

我们想要打印一条声明,指示用户的姓名以及用户的年龄是小于还是大于 25 岁。

aaronkilik@tecMint ~ $ cat users.txt
Sarah L			35    	F
Aaron Kili		40    	M
John  Doo		20    	M
Kili  Seth		49    	M    

我们可以编写一个简短的shell脚本来执行上面的工作,以下是脚本的内容:


#!/bin/bash
awk ' { 
        if ( $3 <= 25 ){
           print "User",$1,$2,"is less than 25 years old." ;
        }
        else {
           print "User",$1,$2,"is more than 25 years old" ; 
}
}'    ~/users.txt

然后保存文件并退出,使脚本可执行并运行,如下所示:

chmod +x test.sh
./test.sh
样本输出
User Sarah L is more than 25 years old
User Aaron Kili is more than 25 years old
User John Doo is less than 25 years old.
User Kili Seth is more than 25 years old

2. for 语句

如果您想在循环中执行某些 Awk 命令,则 for 语句 为您提供了一种合适的方法,其语法如下:

这里,该方法简单地定义为使用计数器来控制循环执行,首先需要初始化计数器,然后根据测试条件运行它,如果为真,则执行操作,最后递增计数器。当计数器不满足条件时循环终止。

for ( counter-initialization; test-condition; counter-increment ){
      actions
}

以下 Awk 命令显示了 for 语句 的工作原理,我们要在其中打印数字 0-10

awk 'BEGIN{ for(counter=0;counter<=10;counter++){ print counter} }'
样本输出
0
1
2
3
4
5
6
7
8
9
10

3. while 语句

while 语句的常规语法如下:

while ( condition ) {
          actions
}

条件是一个 Awk 表达式,操作是条件为真时执行的 Awk 命令行。

下面的脚本演示了如何使用while语句来打印数字0-10

#!/bin/bash
awk ' BEGIN{ counter=0 ;
         
        while(counter<=10){
              print counter;
              counter+=1 ;
             
}
}  

保存文件并使脚本可执行,然后运行它:

chmod +x test.sh
./test.sh
样本输出
0
1
2
3
4
5
6
7
8
9
10

4. do while 语句

它是上面 while 语句的修改,具有以下底层语法:

do {
     actions
}
 while (condition) 

细微的差别在于,在 do while 下,Awk 命令在评估条件之前执行。使用上面 while 语句下的示例,我们可以通过将 test.sh 脚本中的 Awk 命令更改为以下方式来说明 do while 的使用:如下:

#!/bin/bash

awk ' BEGIN{ counter=0 ;  
        do{
            print counter;  
            counter+=1 ;    
        }
        while (counter<=10)   
} 
'

修改脚本后,保存文件并退出。然后使脚本可执行并按如下方式执行:

chmod +x test.sh
./test.sh
样本输出
0
1
2
3
4
5
6
7
8
9
10

结论

这不是关于 Awk 流控制语句的综合指南,正如我之前提到的,Awk 中还有其他几个流控制语句

尽管如此,Awk 系列的这一部分应该让您清楚地了解如何根据特定条件控制 Awk 命令的执行。

您还可以详细阐述其余的流程控制语句,以获得对主题的更多理解。最后,在 Awk 系列的下一部分中,我们将开始编写 Awk 脚本。