linux-shell編程8:awk高級

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}'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章