awk动作在前文中,我们已经使用用过了awk的选项、模式以及动作
如上图所示,红线标注部分就是awk命令中的“动作”。
awk动作上图中,我们将动作拆分成两个部分。
- 红线标注为第一部分:最外侧的括号,即"{ }"。
- 蓝线标注为第二部分:"print $0"。
其实,这两个部分都可以被称为“动作”,只不过它们是不同“类型”的动作而已。
- print属于输出语句类型的动作;
- “{ }”其实也是一个动作,只不过,“{}”属于“组合语句”类型的动作。“组合语句”类型的动作的作用是将多个代码组合成代码块。
如上图所示,我们使用了两个大括号"{}",它们属于"组合语句"类型的动作,它们分别将两个print括住,表示这两个print动作分别是两个独立的个体。
组合动作也就是说,我们可以理解,上图中一共有4个“动作”,两队大括号,两个print,但是上图中,每个大括号中只有一个动作,而我们说过,“组合语句”的作用是将多个代码或多个动作组合成代码块,组合后的代码块被当做一个整体。那么,我们能不能把上图中的两个print动作组合成一个整体?
将两个print组合成一个整体使用;分割动作当我们把多个动作(多段代码)组合成一个代码块的时候,每段动作(每段代码)之间需要用;隔开。
条件判断语句1. 控制语句条件判断
- "if(NR==1)"中的NR为awk的内置变量,NR为行号之意,所以"if(NR==1)"表示行号为1时,条件成立。
- "if(NR==1){print $0}"表示行号为1满足条件,条件满足时,打印整行。
为什么最外侧有大括号。如果非要一个理由,那就是所有动作的最外侧必须用{}括起。
if语句中的大括号,也可以执行多个动作,把多个代码当做一个整体,也就是说,如果if所对应的条件成立,则执行if的大括号中的所有命令。
条件成立后,执行括号里面的所有命令上例中,if对应的大括号中有多条语句,所以if语句中的大括号不能忽略。但是如果if对应的大括号只有一条命令,那么if对应的大括号则可以省略。
模式和动作还记得我们在前面中使用到的“模式”吗?
上图中的用法为awk的【模式】用法,而这篇介绍的【动作】虽然两者在语法上有所区别,但是达到的目的是相同的。
if-else模式if else的条件控制语句
上例中,我们使用了“关系表达式”模式,同时,在动作中,使用了“if...else if...else”这样的“控制语句”。
for循环2. 循环语句
上例中,我们使用了BEGIN模式,BEGIN模式对应的动作中,包含了for循环语句。看到这里,是不是觉得与其他语言中的for循环没有区别。只不过,上例中的for循环语句都写在了一行中而已。
while循环当while对应的条件满足时,则执行对应的语句的语句,语句执行完成后,对条件修改。
do...while语句同理,do...while的示例如下,他与while循环的不同之处在于,while循环只有当满足条件时才会执行对应语句,而do...while循环则是无论是否满足条件,都会执行一遍do对应的代码,然后再判断是否满足while中对应的条件,满足条件,则执行do对应的代码,如果不满足条件,则不再执行do对应的代码。
3. 循环跳出条件
- 使用continue跳出当前循环
- 使用break跳出整个循环体
- 使用exit退出整个awk命令
在shell中,exit命令表示退出当前脚本,在awk中,它的含义也是类似的,表示不再执行awk命令,相当于退出当前的awk命令。
exit退出awk命令当在awk中使用了END模式。exit的作用并不是退出整个awk命令,而是直接执行END模式中的动作。
exit退到END命令中- 使用next命令结束当前行
在awk中,除了能够使用exit命令结束整个awk,还能够使用next命令结束当前行。
我们知道,awk是逐行对文本进行处理的。也就是说,awk会处理完当前行,在继续处理下一行。
使用next命令即可让awk直接从下一行开始处理,换句话说,next命令可以使得awk不继续执行当前操作,而转到下一行。
next命令直接执行下一行其实,next命令与continue有些类似,只是,continue是针对“循环”而言的,continue的作用就是结束“本次循环”,而next是针对“逐行处理而言的”,next的作用就是结束“对当前行的处理”,从而直接执行“下一行”。本质上awk的逐行处理也可以理解为一种循环,因为awk一直在"循环"处理着"每一行"。
网友评论