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 数组不一样