awk 的流程控制语句
说明
在 linux awk 的 while、do-while 和 for 语句中允许使用 break,continue 语句来控制流程走向,也允许使用 exit 这样的语句来退出。break 中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk 中,流程控制语句,语法结构,与 c 语言类型。有了这些语句,其实很多 shell 程序都可以交给 awk,而且性能是非常快的。下面是各个语句用法。
条件判断语句
if(表达式)
{语句1}
else if(表达式)
{语句2}
else
{语法3}
//说明: 这里的if表示如果,else表示否则
示例:
awk 'BEGIN{
test=100; //定义一个变量为100
if(test>90){ //如果test大于90,执行{}里面的内容
print "very good";
}
else if(test>60){ //如果test大于60执行{}里面的内容
print "good";
}
else{ //如果以上两个条件都不满足的话执行{}的内容
print "no pass";
}
//说明:每条命令语句后面可以用;分号结尾。
循环语句
while(表达式)
{语句}
示例:
awk 'BEGIN{
test=100; //定义一个test的值为100;
total=0; //定义一个total的值为0;
while(i<=test){ //当i小于等于test是循环{}里面的内容,直到test不满足条件;
total+=i;
i++;
}
print total; //打印total的值;
}'
for 循环
awk 'BEGIN{
total=0; //定义total的值为0;
for(i=0;i<=100;i++){ //i++是每循环一次i加1,从0开始循环到不满足i<=100时结束循环{}里的内容。
total+=i;
}
print total; //打印total的值
}'
do 循环
do {
循环语句
} while(条件)
示例:
awk 'BEGIN{
total=0;
i=0;
do {
total+=i;
i++;
} while(i<=100) //1. 如果i<=100,执行{}里的内容
print total; //打印total的值
}'
其他语句
- break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。
- continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。
- next能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。
- exit语句使主输入循环退出并将控制转移到 END, 如果 END 存在的话。如果没有定义 END 规则,或在 END 中应用 exit 语句,则终止脚本的执行。
数组应用
数组是 awk 的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在 awk 中数组叫做关联数组 (associative
arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用 0 或空字符串来初始化,这根据上下文而定。
数字做数组索引(下标):
Array[1]="sun"
Array[2]="kai"
字符串做数组索引(下标):
Array["first"]="www"
Array["last"]="name"
Array["birth"]="1987"
说明: 使用中 print Array[1] 会打印出 sun;使用 print
Array[2] 会打印出 kai;使用 print[“birth”] 会得到 1987。
读取数组的值
{ for(item in array) {print array[item]}; } //输出的顺序是随机的
{ for(i=1;i<=len;i++) {print array[i]}; } //Len是数组的长度
数组相关函数
得到数组长度:
awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'
4 4
length 返回字符串以及数组长度,split 进行分割字符串为数组,也会返回分割得到数组长度。
awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'
4
说明:asort 对数组进行排序,返回数组长度
输出数组内容(无序,有序输出):
awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
4 test
1 it
2 is
3 a
说明:for…in 输出,因为数组是关联数组,默认是无序的。所以通过 for…in 得到是无序的数组。如果需要得到有序数组,需要通过下标获得。
awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
1 test
2 it
3 is
5 test
注意: 数组下标是从 1 开始,与 C 数组不一样