天天看点

awk之流程控制指令

if指令

while指令

do while指令

for( 变量;条件;表达式)

for(变量 in 函数)

break 指令

continue 指令

next 指令

exit 指令

● if 指令

语法:

if (表达式) {语句1}

else if (表达式) {语句2}

else {语句3}

范例 :

# awk 'BEGIN {
T=79;
if (T >=80) {
    print "Excellent!";
}                     
else if (T >=60) {
    print "Pass!";
}                 
else {           
    print "Fail";
}               
}'               
Pass!      

说明:

1. 备注:中括号内的语句均可包含多条。

2.设置变量T=79

3.如果T>=80,打印Excellent!

4.如果60<=T<80,打印Pass!

5.如果T小于60,则打印Fail!

● while 指令

语法 :

while( 表达式 ) {语句}

范例 :求100以内的和

# awk 'BEGIN {
max=100;
i=0;
while ( i <= max ) {
    j += i
    i++
}     
    print j;
}'
5050      

范例:打印出变量T中所有连续的数字

# awk 'BEGIN {
T="p12-p34 p56-p78 p9 0";
while(match(T,/[0-9]+/) > 0) {
    print substr(T,RSTART,RLENGTH);
    sub(/[0-9]+/,"",T);
}                     
}'
12
34
56
78
9
0      

1.设置变量“T”等于“ p12-p34 p56-p78”。

2.执行while指令,用match()函数去匹配出现一次以上的数字。

3.如果匹配到数字,则打印出其“起始位置”和“长度”,也就是打印出匹配到的数字。并从变量中删除数字,开始下轮循环。直到while循环结束。

● do-while 指令

do {语句} while(表达式)

# awk 'BEGIN {
i = 0;
j = 0;
do {
    j += i;
    i++;
}
while ( i <= 100 );
print j;
}'      

1.设定变量 i = 0, j = 0

2.把变量 j  的值加变量 i 的值的结果赋予变量 j,变量 i 累加1  

3.一直循环到变量 i >100,则打印变量 j 的值 

● for 指令(一)

for( 变量;条件;表达式) {statement}

范例:计算100以内整数的和

# awk 'BEGIN {
j = 0;
for ( i=0;i<=100;i++ ) {
    j += i;
}
print j;
}'
5050      

说明 :

变量 : 用于设定 for 循环的起始条件, 如上例中的 i=0

条件 : 用于设定该循环的停止条件, 如上例中的 i <= 100

表达式: 用于改变 counter 值, 如上例中的 i++

● for 指令(二)

for(变量 in 函数 ) {statement}

范例:

# awk 'BEGIN {
array["a"]="apple";array["b"]="banana";array[3]="three";array[4]=40;
for ( i in array ) {
printf ( "array[%s] = %s\n",i,array[i] )
}
}'
array[4] = 40
array[a] = apple
array[b] = banana
array[3] = three      

● break 指令

break 指令用以跳出循环(for, while, do-while 等循环).

# awk 'BEGIN {
for ( i = 1; i != 0; i++ ) {
    if ( i == 101 ) {
        break
    }
    j += i
}
print j;
}'
5050      

● continue 指令

循环中的 statement 进行到一半时, 执行 continue 指令来略过循环中尚未执行的statement.

范例 :求整数3以内的和。并打印大于3小于等于5的整数,且在其后加上字符串“hello”。

# awk 'BEGIN {
for (i=0;i<=5;i++) {
    if (i <=3) {
        j+=i;
        continue;
    }
    print i,"hello"
}
print j;
}'
4 hello
5 hello
6      

break的作用是跳出循环。

continue的作用是略过其后的语句,但并未跳出循环。

上例中 i <= 3的值省略了其后的print语句。

● next 指令

执行 next 指令时, awk 将略过该指令之后的所有指令; 继续读取下一笔数据行,继续从第一个 Pattern {Actions} 开始执行。

# cat tmp.txt
web01[192.168.2.100]

httpd            ok
tomcat               ok
sendmail               ok
web02[192.168.2.101]
httpd            ok
postfix               ok
web03[192.168.2.102]
mysqld            ok
httpd               ok

# cat tmp.txt | awk '/^web/ {
T=$0;next};
/^[^$]/ {
printf("%s %s %5s\n",T":\t",$1,$2);
}'
web01[192.168.2.100]:     httpd    ok
web01[192.168.2.100]:     tomcat    ok
web01[192.168.2.100]:     sendmail    ok
web02[192.168.2.101]:     httpd    ok
web02[192.168.2.101]:     postfix    ok
web03[192.168.2.102]:     mysqld    ok
web03[192.168.2.102]:     httpd    ok      
# awk 'BEGIN {
for(i=0;i<=100;i++) {
    if(i==50) { print "exit program!"
        exit
        }
    j += i
    }
print j
}'
exit program!