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!