Awk高級應用
IF語句條件判斷
#if語法:
if(表達式)
動作1
else
動作2
#if語法格式2:
if(表達式) 動作1;else 動作2
[root@server0 ~]# df | grep boot | awk '{print $4}'
387300
[root@server0 ~]# df | grep boot | awk '{if($4<200)print "Error!!";else print "OK"}'
OK
[root@server0 ~]# df | grep boot | awk '{if($4<2000000)print "Error!!";else print "OK"}'
Error!!
[root@server0 ~]#
while語句循環
while語法格式1:
while(條件)
動作
`x=1
while (x<10){
print $x
x++
}`
[root@server0 ~]# awk 'i=1 {} BEGIN {while (i<=10){print i;++i}}'
#while循環語法格式2
do
動作
while (條件)
[root@server0 ~]# awk 'BEGIN {do {++x;print x}while (x<=10)}'
[root@server0 ~]# awk -F: '{i=1;while(i<=NF){print i":"$i;i++}}' passwd.bak
for語句循環
for (變量;條件;計數器)
動作
[root@server0 ~]# awk 'BEGIN {for(i=1;i<=5;i++)print i}'
[root@server0 ~]# awk 'BEGIN {for(i=10;i>=1;i--)print i}'
[root@server0 ~]# awk -F: '{for(i=1;i<=NF;i++){print i":"$i}}' passwd.bak
[root@server0 ~]# awk -F: '{a[$7]++}END{for(i in a)if(i !=""){print i":"a[i]}}' passwd.bak
/bin/sync:1
/bin/bash:2
/sbin/nologin:33
/sbin/halt:1
/bin/false:1
/sbin/shutdown:1
[root@server0 ~]#
##a[$7] 將$7作爲數組的key,然後統計個數
##統計完成後遍歷,for,判斷i是否在數據a中,如果在則打印a[i]值,個數
Break與continue
break:直接跳出循環
continue:終止當前循環
#
打印1-4
for (i-1;i<=10;i++){
if (i=5)
break
print i
}
[root@server0 ~]# awk 'BEGIN {for(i=1;i<=10;i++){if(i==5)break;print i}}'
打印1-4,6-10
for (i=1;i<=10;i++){
if(i=5)
continue
print i
}
[root@server0 ~]# awk 'BEGIN {for(i=1;i<=10;i++){if(i==5)continue;print i}}'
函數
1.rand()函數
作用:產生0-1之間的浮點型的隨機數,rand產生隨機數時需要通過srand()
設置一個參數,否則單獨的rand()每次產生的隨機數相同
[root@server0 ~]# awk 'BEGIN{print rand();srand();print srand()}'
2.gsub(x,y,z)函數
在字串z中使用字符y替換與正則表達式x相匹配的第一個字串,z默認爲$0
3.sub(x,y,z)函數
在字串z中使用字符y替換與正則表達式x相匹配的第一個字串,z默認爲$0
[root@server0 ~]# awk -F: 'gsub(/root/,"hello",$0){print $0}' passwd.bak
hello:x:0:0:hello:/hello:/bin/bash
operator:x:11:0:operator:/hello:/sbin/nologin
[root@server0 ~]#
[root@server0 ~]# awk -F: 'sub(/root/,"hello",$0){print $0}' passwd.bak
hello:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/hello:/sbin/nologin
[root@server0 ~]#
#sub相當於sed中的s///,gsub相當於sed中的s///g.
4.length(z)函數
計算返回字串z的長度
[root@server0 ~]# awk '{print length()}' test.txt
5.getline函數
從輸入中讀取下一行內容
[root@server0 ~]# df -h | awk 'BEGIN {print "Disk FREE"}{if(NF==1){getline;print $3};if(NF==6)print $4}'