一:awk處理條件
使用正則設置條件瘟斜,輸出其中以bash結尾的完整記錄:
[root@svr5 ~]# awk -F: '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
輸出包含root的行數據:
[root@svr5 ~]# awk -F: '/root/' /etc/passwd
輸出root或adm賬戶的用戶名和UID信息:
[root@svr5 ~]# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd
root 0
adm 3
輸出賬戶名稱包含root的基本信息(第1列包含root):
[root@svr5 ~]# awk -F: '$1~/root/' /etc/passwd
輸出其中登錄Shell不以nologin結尾(對第7個字段做!~反向匹配)的用戶名、登錄Shell信息:
[root@svr5 ~]# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
使用數值/字符串比較設置條件
比較符號:==(等于) !=(不等于) >(大于)>=(大于等于) <(小于) <=(小于等于)
輸出第3行(行號NR等于3)的用戶記錄:
[root@svr5 ~]# awk -F: 'NR==3{print}' /etc/passwd
輸出賬戶UID大于等于1000的賬戶名稱和UID信息:
[root@svr5 ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
tom 1000
jerry 1001
輸出賬戶UID小于10的賬戶名稱和UID信息:
[root@svr5 ~]# awk -F: '$3<10{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
輸出用戶名為“root”的行:
[root@svr5 ~]# awk -F: '$1=="root"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
邏輯測試條件
輸出賬戶UID大于10并且小于20的賬戶信息:
[root@svr5 ~]# awk -F: '$3>10 && $3<20' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
輸出賬戶UID大于1000或者賬戶UID小于10的賬戶信息:
[root@svr5 ~]# awk -F: '$3>1000 || $3<10' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
varnish:x:1001:1001::/home/varnish:/sbin/nologin
nginx:x:1002:1002::/home/nginx:/sbin/nologin
數學運算
[root@svr5 ~]# awk 'BEGIN{x++;print x}'
1
[root@svr5 ~]# awk 'BEGIN{x=8;print x+=2}'
10
[root@svr5 ~]# awk 'BEGIN{x=8;x--;print x}'
7
[root@svr5 ~]# awk 'BEGIN{print 2+3}'
5
[root@svr5 ~]# awk 'BEGIN{print 2*3}'
6
[root@svr5 ~]# awk 'BEGIN{print 2*3}'
6
[root@svr5 ~]# awk 'BEGIN{ print 23%8}'
7
[root@svr5 ~]# seq 200 | awk '$1%3==0' //找200以內3的倍數
… …
1)列出UID間于1~1000的用戶詳細信息:
[root@svr5 ~]# awk -F: '$3>=1 && $3<=1000' /etc/passwd
2)輸出/etc/hosts映射文件內以127或者192開頭的記錄:
[root@svr5 ~]# awk '/^(127|192)/' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.4.5 svr5.tarena.com svr5
3)列出100以內整數中7的倍數或是含7的數:
[root@svr5 ~]# seq 100 | awk '$1%7==0||$1~/7/'
7
14
17
21
27
28
35
37
42
47
.. ..
二:awk數組
數組是一個可以存儲多個值的變量痪寻,具體使用的格式如下:
定義數組的格式:數組名[下標]=元素值
調用數組的格式:數組名[下標]
遍歷數組的用法:for(變量 in 數組名){print 數組名[變量]}螺句。
[root@svr5 ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'
88 11
[root@svr5 ~]# awk 'BEGIN{a++;print a}'
1
[root@svr5 ~]# awk 'BEGIN{a0++;print a0}'
1
[root@svr5 ~]# awk 'BEGIN{a[0]++;print a[0]}'
1
[root@svr5 ~]# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'
0 0
1 11
2 22
注:awk數組的下標除了可以使用數字,也可以使用字符串槽华,字符串需要使用雙引號:
[root@svr5 ~]# awk 'BEGIN{a["hehe"]=11;print a["hehe"]}'
11
三:awk擴展應用
使用awk工具壹蔓,分析Web日志的訪問量排名,要求獲得客戶機的地址猫态、訪問次數佣蓉,并且按照訪問次數排名:
在分析Web日志文件時,每條訪問記錄的第一列為客戶機的IP地址亲雪,其中會有很多重復的IP勇凭,所以還需要統(tǒng)計重復記錄的數量并且進行排序;
通過awk提取信息時义辕,利用IP地址作為數組下標虾标,每遇到一個重復值就將此數組元素遞增1,最終就獲得了這個IP地址出現的次數灌砖;
針對文本排序輸出可以采用sort命令璧函,相關的常見選項為-r傀蚌、-n、-k蘸吓。其中-n表示按數字順序升序排列善炫,而-r表示反序,-k可以指定按第幾個字段來排序库继。
1)提取IP地址及訪問量
[root@svr5 ~]# 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@svr5 ~]# 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
.. ..
例:編寫監(jiān)控腳本箩艺,實現計算機各個性能數據監(jiān)控的功能,監(jiān)控如下項目:
CPU負載
網卡流量
內存剩余容量
磁盤剩余容量
計算機賬戶數量
當前登錄賬戶數量
計算機當前開啟的進程數量
本機已安裝的軟件包數量
先了解查看性能數據的命令
[root@svr5 ~]# uptime //查看CPU負載
[root@svr5 ~]# ifconfig eth0 //查看網卡流量
[root@svr5 ~]# free //查看內存信息
[root@svr5 ~]# df //查看磁盤空間
[root@svr5 ~]# wc -l /etc/passwd //查看計算機賬戶數量
[root@svr5 ~]# who |wc -l //查看登錄賬戶數量
[root@svr5 ~]# rpm -qa |wc -l //查看已安裝軟件包數量
腳本:
[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 "根分區(qū)剩余容量為:"$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
例:編寫安全檢測腳本
編寫腳本艺谆,防止遠程ssh暴力破解密碼,配置如下監(jiān)控項目:
檢測ssh登錄日志拜英,如果遠程登陸賬號名錯誤3次静汤,則屏蔽遠程主機的IP
檢測ssh登錄日志,如果遠程登陸密碼錯誤3次居凶,則屏蔽遠程主機的IP
1)過濾帳戶名失敗的命令(登陸日志文件為/var/log/secure)
[root@svr5 ~]# awk '/Invalid user/{print $10}' /var/log/secure
2)過濾密碼失敗的命令
awk '/Failed password/{print $11}' /var/log/secure
腳本:
[root@svr5 ~]# vim test.sh
#!/bin/bash
awk '/Failed password/{print $11}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '$1>3{print $2}'
awk '/Invalid user/{print $10}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '$1>3{print $2}'