博客 / 詳情

返回

Linux awk 命令詳解(二) if 分支 數組

一、awk if分支結構

  • if分支結構(單分支、雙分支、多分支)
  • 單分支
    -- if(條件){編輯指令}
  • 雙分支
    -- if(條件){編輯指令1}else{編輯指令2}
  • 多分支
    -- if(條件){編輯指令1}else if(條件){編輯指令2}.. ..
    else{編輯指令N}

案例1
awk過濾中的if分支結構
1)單分支
統計/etc/passwd文件中UID小於或等於1000的用户個數:

[root@case100 ~]# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
23

統計/etc/passwd文件中UID大於1000的用户個數:

[root@case100 ~]# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
3

統計/etc/passwd文件中登錄Shell是“/bin/bash”的用户個數:

[root@case100 ~]# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
5

2)雙分支
分別統計/etc/passwd文件中UID小於或等於1000、UID大於1000的用户個數:

[root@case100 ~]# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd
23 3

分別統計/etc/passwd文件中登錄Shell是“/bin/bash”、 登錄Shell不是“/bin/bash”的用户個數:

[root@case100 ~]# awk -F: '{if($7~/bash$/){i++}else{j++}}END{print i,j}' /etc/passwd
5 21

二、awk數組

  • 數組的語法格式
    數組是一個可以存儲多個值的變量,具體使用的格式如下:
  • 定義數組
    -- 格式:數組名[下標]=元素值
  • 調用數組
    -- 格式:數組名[下標]
  • 遍歷數組
    -- 用法:for(變量 in 數組名){print 數組名[變量]}

案例2 for循環

[root@case100 ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'
88 11
[root@case100 ~]# awk 'BEGIN{a++;print a}'
1
[root@case100 ~]# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=222;for(i in a){print i,a[i]}}'
0 0
1 11
2 222

注意,awk數組的下標除了可以使用數字,也可以使用字符串,字符串需要使用雙引號:

[root@case100 ~]# awk 'BEGIN{a["hehe"]=22;print a["hehe"]}'
22

案例3:awk擴展應用
1)awk統計Web訪問排名
在分析Web日誌文件時,每條訪問記錄的第一列就是客户機的IP地址,其中會有很多重複的IP地址。因此只用awk提取出這一列是不夠的,還需要統計重複記錄的數量並且進行排序。
通過awk提取信息時,利用IP地址作為數組下標,每遇到一個重複值就將此數組元素遞增1,最終就獲得了這個IP地址出現的次數。
針對文本排序輸出可以採用sort命令,相關的常見選項為-r、-n、-k。其中-n表示按數字順序升序排列,而-r表示反序,-k可以指定按第幾個字段來排序

實現此案例需要按照如下步驟進行。
步驟一:統計Web訪問量排名
分步測試、驗證效果如下所述。
1)提取IP地址及訪問量

[root@case100 ~]# awk '{ip[$1]++} \
>  END{for(i in ip) {print ip[i],i }}' /var/log/httpd/access_log
4  127.0.0.1
17 192.168.4.5
13 192.168.4.110
... ...

2)對第1)步的結果根據訪問量排名

[root@case100 ~]# awk  '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}'  /var/log/httpd/access_log | sort -nr
17  192.168.4.5
13  192.168.4.110
4   127.0.0.1
... ...

案例4:編寫監控腳本
本案例要求編寫腳本,實現計算機各個性能數據監控的功能,具體監控項目要求如下:
CPU負載
網卡流量
內存剩餘容量
磁盤剩餘容量
計算機賬户數量
當前登錄賬户數量
計算機當前開啓的進程數量
本機已安裝的軟件包數量

步驟
實現此案例需要按照如下步驟進行。
步驟一:準備工作
1)查看性能數據的命令

[root@case100 ~]# uptime                            //查看CPU負載
[root@case100 ~]# ifconfig eth0                    //查看網卡流量
[root@case100 ~]# free                            //查看內存信息
[root@case100 ~]# df                                //查看磁盤空間
[root@case100 ~]# wc -l /etc/passwd                //查看計算機賬户數量
[root@case100 ~]# who |wc -l                        //查看登錄賬户數量
[root@case100 ~]# rpm -qa |wc -l                    //查看已安裝軟件包數量

步驟二:編寫參考腳本
1)腳本內容如下:

[root@svr5 ~]# vim test.sh
#!/bin/bash
ip=`ifconfig eth0 | awk '/inet /{print $2}'`
echo "本地IP地址是:"$ip
cpu=`uptime | awk '{print $NF}'`            
#awk中NF為當前行的列數,$NF是最後一列
echo "本機CPU最近15分鐘的負載是:"$cpu
net_in=`ifconfig eth0 | awk '/RX p/{print $5}'`
echo "入站網卡流量為:"$net_in
net_out=`ifconfig eth0 | awk '/TX p/{print $5}'`
echo "出站網卡流量為:"$net_out
mem=`free | awk '/Mem/{print $4}'`
echo "內存剩餘容量為:"$mem
disk=`df | awk '/\/$/{print $4}'`
echo "根分區剩餘容量為:"$disk
user=`cat /etc/passwd |wc -l`
echo "本地賬户數量為:"$user
login=`who | wc -l`
echo "當前登陸計算機的賬户數量為:"$login
process=`ps aux | wc -l`
echo "當前計算機啓動的進程數量為:"$process
soft=`rpm -qa | wc -l`
echo "當前計算機已安裝的軟件數量為:"$soft
[root@logfile ~]# bash test.sh 
本地IP地址是:192.168.44.99
本機CPU最近15分鐘的負載是:0.05
入站網卡流量為:4942189501092
出站網卡流量為:9051024375282
內存剩餘容量為:160136
根分區剩餘容量為:84142524
本地賬户數量為:32
當前登陸計算機的賬户數量為:1
當前計算機啓動的進程數量為:160
當前計算機已安裝的軟件數量為:403
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.