目錄
一贪绘、awk if分支結(jié)構(gòu)
二炎咖、awk數(shù)組 for循環(huán)
一、awk if分支結(jié)構(gòu)
- if分支結(jié)構(gòu)(單分支来农、雙分支鞋真、多分支)
- 單分支
-- if(條件){編輯指令} - 雙分支
-- if(條件){編輯指令1}else{編輯指令2} - 多分支
-- if(條件){編輯指令1}else if(條件){編輯指令2}.. ..
else{編輯指令N}
案例1
awk過(guò)濾中的if分支結(jié)構(gòu)
1)單分支
統(tǒng)計(jì)/etc/passwd文件中UID小于或等于1000的用戶個(gè)數(shù):
[root@case100 ~]# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
23
統(tǒng)計(jì)/etc/passwd文件中UID大于1000的用戶個(gè)數(shù):
[root@case100 ~]# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
3
統(tǒng)計(jì)/etc/passwd文件中登錄Shell是“/bin/bash”的用戶個(gè)數(shù):
[root@case100 ~]# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
5
2)雙分支
分別統(tǒng)計(jì)/etc/passwd文件中UID小于或等于1000、UID大于1000的用戶個(gè)數(shù):
[root@case100 ~]# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd
23 3
分別統(tǒng)計(jì)/etc/passwd文件中登錄Shell是“/bin/bash”沃于、 登錄Shell不是“/bin/bash”的用戶個(gè)數(shù):
[root@case100 ~]# awk -F: '{if($7~/bash$/){i++}else{j++}}END{print i,j}' /etc/passwd
5 21
二涩咖、awk數(shù)組
數(shù)組的語(yǔ)法格式
數(shù)組是一個(gè)可以存儲(chǔ)多個(gè)值的變量,具體使用的格式如下:定義數(shù)組
-- 格式:數(shù)組名[下標(biāo)]=元素值調(diào)用數(shù)組
-- 格式:數(shù)組名[下標(biāo)]遍歷數(shù)組
-- 用法:for(變量 in 數(shù)組名){print 數(shù)組名[變量]}
案例2 for循環(huán)
[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數(shù)組的下標(biāo)除了可以使用數(shù)字檩互,也可以使用字符串,字符串需要使用雙引號(hào):
[root@case100 ~]# awk 'BEGIN{a["hehe"]=22;print a["hehe"]}'
22
案例3:awk擴(kuò)展應(yīng)用
1)awk統(tǒng)計(jì)Web訪問(wèn)排名
在分析Web日志文件時(shí)咨演,每條訪問(wèn)記錄的第一列就是客戶機(jī)的IP地址闸昨,其中會(huì)有很多重復(fù)的IP地址。因此只用awk提取出這一列是不夠的薄风,還需要統(tǒng)計(jì)重復(fù)記錄的數(shù)量并且進(jìn)行排序饵较。
通過(guò)awk提取信息時(shí),利用IP地址作為數(shù)組下標(biāo)遭赂,每遇到一個(gè)重復(fù)值就將此數(shù)組元素遞增1循诉,最終就獲得了這個(gè)IP地址出現(xiàn)的次數(shù)。
針對(duì)文本排序輸出可以采用sort命令嵌牺,相關(guān)的常見(jiàn)選項(xiàng)為-r打洼、-n、-k逆粹。其中-n表示按數(shù)字順序升序排列募疮,而-r表示反序,-k可以指定按第幾個(gè)字段來(lái)排序
實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行僻弹。
步驟一:統(tǒng)計(jì)Web訪問(wèn)量排名
分步測(cè)試阿浓、驗(yàn)證效果如下所述。
1)提取IP地址及訪問(wèn)量
[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)對(duì)第1)步的結(jié)果根據(jù)訪問(wèn)量排名
[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:編寫(xiě)監(jiān)控腳本
本案例要求編寫(xiě)腳本蹋绽,實(shí)現(xiàn)計(jì)算機(jī)各個(gè)性能數(shù)據(jù)監(jiān)控的功能芭毙,具體監(jiān)控項(xiàng)目要求如下:
CPU負(fù)載
網(wǎng)卡流量
內(nèi)存剩余容量
磁盤(pán)剩余容量
計(jì)算機(jī)賬戶數(shù)量
當(dāng)前登錄賬戶數(shù)量
計(jì)算機(jī)當(dāng)前開(kāi)啟的進(jìn)程數(shù)量
本機(jī)已安裝的軟件包數(shù)量
步驟
實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:準(zhǔn)備工作
1)查看性能數(shù)據(jù)的命令
[root@case100 ~]# uptime //查看CPU負(fù)載
[root@case100 ~]# ifconfig eth0 //查看網(wǎng)卡流量
[root@case100 ~]# free //查看內(nèi)存信息
[root@case100 ~]# df //查看磁盤(pán)空間
[root@case100 ~]# wc -l /etc/passwd //查看計(jì)算機(jī)賬戶數(shù)量
[root@case100 ~]# who |wc -l //查看登錄賬戶數(shù)量
[root@case100 ~]# rpm -qa |wc -l //查看已安裝軟件包數(shù)量
步驟二:編寫(xiě)參考腳本
1)腳本內(nèi)容如下:
[root@svr5 ~]# vim test.sh
#!/bin/bash
ip=`ifconfig eth0 | awk '/inet /{print $2}'`
echo "本地IP地址是:"$ip
cpu=`uptime | awk '{print $NF}'`
#awk中NF為當(dāng)前行的列數(shù)卸耘,$NF是最后一列
echo "本機(jī)CPU最近15分鐘的負(fù)載是:"$cpu
net_in=`ifconfig eth0 | awk '/RX p/{print $5}'`
echo "入站網(wǎng)卡流量為:"$net_in
net_out=`ifconfig eth0 | awk '/TX p/{print $5}'`
echo "出站網(wǎng)卡流量為:"$net_out
mem=`free | awk '/Mem/{print $4}'`
echo "內(nèi)存剩余容量為:"$mem
disk=`df | awk '/\/$/{print $4}'`
echo "根分區(qū)剩余容量為:"$disk
user=`cat /etc/passwd |wc -l`
echo "本地賬戶數(shù)量為:"$user
login=`who | wc -l`
echo "當(dāng)前登陸計(jì)算機(jī)的賬戶數(shù)量為:"$login
process=`ps aux | wc -l`
echo "當(dāng)前計(jì)算機(jī)啟動(dòng)的進(jìn)程數(shù)量為:"$process
soft=`rpm -qa | wc -l`
echo "當(dāng)前計(jì)算機(jī)已安裝的軟件數(shù)量為:"$soft
[root@logfile ~]# bash test.sh
本地IP地址是:192.168.44.99
本機(jī)CPU最近15分鐘的負(fù)載是:0.05
入站網(wǎng)卡流量為:4942189501092
出站網(wǎng)卡流量為:9051024375282
內(nèi)存剩余容量為:160136
根分區(qū)剩余容量為:84142524
本地賬戶數(shù)量為:32
當(dāng)前登陸計(jì)算機(jī)的賬戶數(shù)量為:1
當(dāng)前計(jì)算機(jī)啟動(dòng)的進(jìn)程數(shù)量為:160
當(dāng)前計(jì)算機(jī)已安裝的軟件數(shù)量為:403