一、控制語句
1 if-else語句
使用場景:對awk取得的整行或某個字段做條件判斷
語法:
if(condition) statement [else statement]
if(condition1){statement1}else if(condition2){statement 2}else{statement3}
例:判斷uid是否大于等于500,是則為普通用戶,否則為root或系統用戶
]#awk -F: '{if($3>=500){printf "Common User: %-15s,uid %d\n",$1,$3} else {printf "Root or Sysuser: %-15s,uid %i\n",$1,$3}}' /etc/passwd
例:取id為偶數的用戶名及UID
例:取出shell為bash的用戶
例:判斷磁盤的利用率,大于20則給出警告。
]#df -Th |awk -F[%] '/^\/dev\/(sd|ma).*/{print $1}' |awk '{if($NF>=20){printf "Warning,%s usage has %d\n",$1,$NF} }'
2 while循環語句
語法:while(condition) {statements}
條件為真,進入循環;條件為假,退出循環
使用場景:對一行內的多個字段逐一進行類似處理時使用,對數組中的元素逐一處理時使用
例:統計/etc/grub2.cfg文件中以linux16(前面可跟任意個空格)開頭的行的每一個單詞的字符數
]#awk '/^[[:space:]]*linux16/{num=1;while(num<=NF){print $num,length($num);num++}}' /etc/grub2.cfg
例:在上一個例子的基礎上,只顯示字符數大于等于7的單詞。
]#awk '/^[[:space:]]*linux16/{n=1;while(n<=NF){if(length($n)>=7){print $n,length($n)}n++}}' /etc/grub2.cfg
3 do-while循環語句
語法:do statement while(condition)
無論判斷條件為真或假,至少執行一次循環體
]#awk '{do{print "I am the King! "} while($1=="King")}' /etc/passwd
4 for循環語句
語法:for(expr1;expr2;expr3) {statements}
for(變量賦值;條件;變量修正)
例:使用for循環實現統計/etc/grub2.cfg文件中以linux16(前面可跟任意個空格)開頭的行的每一個單詞的字符數,并只顯示字符數大于等于7的
]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){if(length($i)>=7){print $i,length($i)}}}' /etc/grub2.cfg
for的特殊用法:
能夠遍歷數組中的元素:for(var in array) {for-body}
例:
awk 'BEGIN{test["1st"]="First";test["2nd"]="Second";for(a in test){print test[a]}}'
5 switch語句
語法:switch(expression) {case VALUE1 or /REGEXP1/:statement1;case VALUE2 or /REGEXP2/:statement2;….;default:statement}
例:
]#awk '{switch($3) { case "xfs":print "i am xfs" ; case "ext4":print "i am ext4";default : print "unknown"; }}' /etc/fstab
注:switch語句在CentOS7系列中使用正常,在6中使用會報錯誤提示。
6 break&continue
break [n]:用于退出循環體,不再執行循環。
在for循環中使用
在while循環中使用
continue:用于退出當次循環,continue后面的循環體不再運行,而是直接進入下一次循環。只能用在for循環體中。
continue用在while循環中,不能正確退出
7 next
用于控制awk的內生循環,提前結束對當前行的處理,直接進入下一行。
例:取出id號為奇數的用戶名
]#awk -F: '{if($3%2==0){next}else{print $1,$3}}' /etc/passwd
8、數組
在awk中,所有數組都是關聯數組。
關聯數組:array[index-expression]
index-expression
1)可使用任意字符串,字符串要使用雙引號””
2)如果某數組元素事先不存在,在引用時,awk會自動創建次元素,并將其值初始化為“空串”
若要判斷在數組中是否存在某元素,要使用“index in array”格式進行。
若要遍歷數組中的每一個元素,需要使用for循環
for(var in array){for-body}
注意:var的值為數組的下標
例:分別統計網絡連接中的LISTEN、ESTABLISHED狀態的連接數
netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'
ss -tan |awk '/^[LE]/{state[$1]++}END{for(i in state){print i,state[i]}}'
例:
(1)統計/etc/fstab文件中每個文件類型出現的次數
cat /etc/fstab | awk '!/^#/&&!/^$/{fstype[$3]++}END{for(i in fstype){print i,fstype[i]}}'
(2)統計指定文件中每個單詞出現的次數
cat /etc/fstab | awk -F[" "=/,"\t"] '{for(i=1;i<=NF;i++){word[$i]++}}END{for(n in word){print n,word[n]}}'
二、函數
內置函數
自定義函數
1、內置函數
數值處理
rand():返回0和1之間的一個隨機數
字符串處理
length([s]):返回指定字符串的長度。
split(s,a[,r]):以r為分隔符切割s,并將切割后的結果保存至a所表示的屬組中
其數組下標從1開始
例:統計遠程連接到當前主機的ip數
netstat -tan | awk '/^tcp\>/{split($5,ip,":");ip_count[ip[1]]++}END{for(i in ip_count) print i,ip_count[i]}'
sub(r,s,[t]) :對t 字符串進行搜索r 表示的模式匹配的內容,并將第一個匹
配的內容替換為s。
例:將/etc/passwd中root用戶的用戶名替換為superman
將/etc/fstab中ext4的文件類型替換為xfs
gsub(r,s,[t]) :對t 字符串進行搜索r 表示的模式匹配的內容,并全部替換
為s。
例
2、自定義函數
格式:
function name ( parameter, parameter, … ) {
statements
return expression
}
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/48231