天天看點

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!