課程目標(biāo)
一,、awk介紹1. awk概述
2. awk能干啥?
二,、awk使用方式1. 命令行模式使用㈠ 語(yǔ)法結(jié)構(gòu)
㈡ 常用選項(xiàng)介紹
㈢ '命名部分說(shuō)明'
2. 腳本模式使用㈠ 腳本編寫
㈡ 腳本執(zhí)行
三,、 awk內(nèi)部相關(guān)變量
1、常用內(nèi)置變量舉例
2,、內(nèi)置變量分隔符舉例
四,、 awk工作原理
五,、awk使用進(jìn)階1. 格式化輸出
|
運(yùn)算符 | 說(shuō)明 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
~ | 匹配 |
!~ | 不匹配 |
! | 邏輯非 |
&& | 邏輯與 |
|| | 邏輯或 |
從第一行開始匹配到以lp開頭行
awk -F: 'NR==1,/^lp/{print $0 }' passwd
從第一行到第5行
awk -F: 'NR==1,NR==5{print $0 }' passwd
從以lp開頭的行匹配到第10行
awk -F: '/^lp/,NR==10{print $0 }' passwd
從以root開頭的行匹配到以lp開頭的行
awk -F: '/^root/,/^lp/{print $0}' passwd
打印以root開頭或者以lp開頭的行
awk -F: '/^root/ || /^lp/{print $0}' passwd
awk -F: '/^root/;/^lp/{print $0}' passwd
顯示5-10行
awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd
awk -F: 'NR<10 && NR>5 {print $0}' passwd
打印30-39行以bash結(jié)尾的內(nèi)容:
[root@MissHou shell06]# awk 'NR>=30 && NR<=39 && $0 ~ /bash$/{print $0}' passwd
stu1:x:500:500::/home/stu1:/bin/bash
yunwei:x:501:501::/home/yunwei:/bin/bash
user01:x:502:502::/home/user01:/bin/bash
user02:x:503:503::/home/user02:/bin/bash
user03:x:504:504::/home/user03:/bin/bash
[root@MissHou shell06]# awk 'NR>=3 && NR<=8 && /bash$/' 1.txt
stu7:x:1007:1007::/rhome/stu7:/bin/bash
stu8:x:1008:1008::/rhome/stu8:/bin/bash
stu9:x:1009:1009::/rhome/stu9:/bin/bash
打印文件中1-5并且以root開頭的行
[root@MissHou shell06]# awk 'NR>=1 && NR<=5 && $0 ~ /^root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
[root@MissHou shell06]# awk 'NR>=1 && NR<=5 && $0 !~ /^root/{print $0}' 1.txt
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
理解;號(hào)和||的含義:
[root@MissHou shell06]# awk 'NR>=3 && NR<=8 || /bash$/' 1.txt
[root@MissHou shell06]# awk 'NR>=3 && NR<=8;/bash$/' 1.txt
打印IP地址
# ifconfig eth0|awk 'NR>1 {print $2}'|awk -F':' 'NR<2 {print $2}'
# ifconfig eth0|grep Bcast|awk -F':' '{print $2}'|awk '{print $1}'
# ifconfig eth0|grep Bcast|awk '{print $2}'|awk -F: '{print $2}'
# ifconfig eth0|awk NR==2|awk -F '[ :]+' '{print $4RS$6RS$8}'
# ifconfig eth0|awk -F"[ :]+" '/inet addr:/{print $4}'
[root@MissHou ~] awk '/bash$/{print $0}' /etc/passwd
[root@MissHou ~] awk '/bash$/{print $0}' /etc/passwd
[root@MissHou ~] awk '/bash$/' /etc/passwd
[root@MissHou ~] awk -F: '$7 ~ /bash/' /etc/passwd
[root@MissHou ~] awk -F: '$NF ~ /bash/' /etc/passwd
[root@MissHou ~] awk -F: '$0 ~ /bash/' /etc/passwd
[root@MissHou ~] awk -F: '$0 ~ /\/bin\/bash/' /etc/passwd
# awk -F: '$0 ~ /\/bin\/bash/{print $1}' /etc/passwd
500 stu1
501 yunwei
502 user01
503 user02
504 user03
# awk -F: 'BEGIN{print "UID\tUSERNAME"} {if($3>=500 && $3 !=65534 ) {print $3"\t"$1} }' /etc/passwdUID USERNAME
# awk -F: '{if($3 >= 500 && $3 != 65534) print $1,$3}' a.txt
redhat 508
user01 509
u01 510
YUNWEI 511
if語(yǔ)句:
if [ xxx ];then
xxx
fi
格式:
awk 選項(xiàng) '正則,,地址定位{awk語(yǔ)句}' 文件名
{ if(表達(dá)式){語(yǔ)句1;語(yǔ)句2;...}}
awk -F: '{if($3>=500 && $3<=60000) {print $1,$3} }' passwd
# awk -F: '{if($3==0) {print $1"是管理員"} }' passwd
root是管理員
# awk 'BEGIN{if('$(id -u)'==0) {print "admin"} }'
admin
if...else語(yǔ)句:
if [ xxx ];then
xxxxx
else
xxx
fi
格式:
{if(表達(dá)式){語(yǔ)句;語(yǔ)句;...}else{語(yǔ)句;語(yǔ)句;...}}
awk -F: '{ if($3>=500 && $3 != 65534) {print $1"是普通用戶"} else {print $1,"不是普通用戶"}}' passwd
awk 'BEGIN{if( '$(id -u)'>=500 && '$(id -u)' !=65534 ) {print "是普通用戶"} else {print "不是普通用戶"}}'
if [xxxx];then
xxxx
elif [xxx];then
xxx
....
else
...
fi
if...else if...else語(yǔ)句:
格式:
{ if(表達(dá)式1){語(yǔ)句;語(yǔ)句,;...}else if(表達(dá)式2){語(yǔ)句;語(yǔ)句,;...}else if(表達(dá)式3){語(yǔ)句;語(yǔ)句;...}else{語(yǔ)句;語(yǔ)句,;...}}
awk -F: '{ if($3==0) {print $1,":是管理員"} else if($3>=1 && $3<=499 || $3==65534 ) {print $1,":是系統(tǒng)用戶"} else {print $1,":是普通用戶"}}'
awk -F: '{ if($3==0) {i++} else if($3>=1 && $3<=499 || $3==65534 ) {j++} else {k++}};END{print "管理員個(gè)數(shù)為:"i "\n系統(tǒng)用戶個(gè)數(shù)為:"j"\n普通用戶的個(gè)數(shù)為:"k }'
# awk -F: '{if($3==0) {print $1,"is admin"} else if($3>=1 && $3<=499 || $3==65534) {print $1,"is sys users"} else {print $1,"is general user"} }' a.txt
root is admin
bin is sys users
daemon is sys users
adm is sys users
lp is sys users
redhat is general user
user01 is general user
named is sys users
u01 is general user
YUNWEI is general user
awk -F: '{ if($3==0) {print $1":管理員"} else if($3>=1 && $3<500 || $3==65534 ) {print $1":是系統(tǒng)用戶"} else {print $1":是普通用戶"}}' /etc/passwd
awk -F: '{if($3==0) {i++} else if($3>=1 && $3<500 || $3==65534){j++} else {k++}};END{print "管理員個(gè)數(shù)為:" i RS "系統(tǒng)用戶個(gè)數(shù)為:"j RS "普通用戶的個(gè)數(shù)為:"k }' /etc/passwd
管理員個(gè)數(shù)為:1
系統(tǒng)用戶個(gè)數(shù)為:28
普通用戶的個(gè)數(shù)為:27
# awk -F: '{ if($3==0) {print $1":是管理員"} else if($3>=500 && $3!=65534) {print $1":是普通用戶"} else {print $1":是系統(tǒng)用戶"}}' passwd
awk -F: '{if($3==0){i++} else if($3>=500){k++} else{j++}} END{print i; print k; print j}' /etc/passwd
awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理員個(gè)數(shù): "i; print "普通用個(gè)數(shù): "k; print "系統(tǒng)用戶: "j}' /etc/passwd
如果是普通用戶打印默認(rèn)shell,,如果是系統(tǒng)用戶打印用戶名
# awk -F: '{if($3>=1 && $3<500 || $3 == 65534) {print $1} else if($3>=500 && $3<=60000 ) {print $NF} }' /etc/passwd
打印1~5
for ((i=1;i<=5;i++));do echo $i;done
# awk 'BEGIN { for(i=1;i<=5;i++) {print i} }'
打印1~10中的奇數(shù)
# for ((i=1;i<=10;i+=2));do echo $i;done|awk '{sum+=$0};END{print sum}'
# awk 'BEGIN{ for(i=1;i<=10;i+=2) {print i} }'
# awk 'BEGIN{ for(i=1;i<=10;i+=2) print i }'
計(jì)算1-5的和
# awk 'BEGIN{sum=0;for(i=1;i<=5;i++) sum+=i;print sum}'
# awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);{print sum}}'
# awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);print sum}'
打印1-5
# i=1;while (($i<=5));do echo $i;let i++;done
# awk 'BEGIN { i=1;while(i<=5) {print i;i++} }'
打印1~10中的奇數(shù)
# awk 'BEGIN{i=1;while(i<=10) {print i;i+=2} }'
計(jì)算1-5的和
# awk 'BEGIN{i=1;sum=0;while(i<=5) {sum+=i;i++}; print sum }'
# awk 'BEGIN {i=1;while(i<=5) {(sum+=i) i++};print sum }'
嵌套循環(huán):
#!/bin/bash
for ((y=1;y<=5;y++))
do
for ((x=1;x<=$y;x++))
do
echo -n $x
done
echo
done
awk 'BEGIN{ for(y=1;y<=5;y++) {for(x=1;x<=y;x++) {printf x} ;print } }'
# awk 'BEGIN { for(y=1;y<=5;y++) { for(x=1;x<=y;x++) {printf x};print} }'
1
12
123
1234
12345
# awk 'BEGIN{ y=1;while(y<=5) { for(x=1;x<=y;x++) {printf x};y++;print}}'
1
12
123
1234
12345
嘗試用三種方法打印99口訣表:
#awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) {printf x"*"y"="x*y"\t"};print} }'
#awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) printf x"*"y"="x*y"\t";print} }'
#awk 'BEGIN{i=1;while(i<=9){for(j=1;j<=i;j++) {printf j"*"i"="j*i"\t"};print;i++ }}'
#awk 'BEGIN{for(i=1;i<=9;i++){j=1;while(j<=i) {printf j"*"i"="i*j"\t";j++};print}}'
循環(huán)的控制:
break 條件滿足的時(shí)候中斷循環(huán)
continue 條件滿足的時(shí)候跳過循環(huán)
# awk 'BEGIN{for(i=1;i<=5;i++) {if(i==3) break;print i} }'
1
2
# awk 'BEGIN{for(i=1;i<=5;i++){if(i==3) continue;print i}}'
1
2
4
5
+ - * / %(模) ^(冪2^3)
可以在模式中執(zhí)行計(jì)算,awk都將按浮點(diǎn)數(shù)方式執(zhí)行算術(shù)運(yùn)算
# awk 'BEGIN{print 1+1}'
# awk 'BEGIN{print 1**1}'
# awk 'BEGIN{print 2**3}'
# awk 'BEGIN{print 2/3}'
# awk -F: '{ shells[$NF]++ };END{for (i in shells) {print i,shells[i]} }' /etc/passwd
books[linux]++
books[linux]=1
shells[/bin/bash]++
shells[/sbin/nologin]++
/bin/bash 5
/sbin/nologin 6
shells[/bin/bash]++ a
shells[/sbin/nologin]++ b
shells[/sbin/shutdown]++ c
books[linux]++
books[php]++
# ss -antp|grep 80|awk '{states[$1]++};END{for(i in states){print i,states[i]}}'
TIME_WAIT 578
ESTABLISHED 1
LISTEN 1
# ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}'
LISTEN 1
ESTAB 5
TIME-WAIT 25
# ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}' |sort -k2 -rn
TIME-WAIT 18
ESTAB 8
LISTEN 1
# netstat -ant |grep :80 |awk -F: '{ip_count[$8]++};END{for(i in ip_count){print i,ip_count[i]} }' |sort
# ss -an |grep :80 |awk -F":" '!/LISTEN/{ip_count[$(NF-1)]++};END{for(i in ip_count){print i,ip_count[i]}}' |sort -k2 -rn |head
統(tǒng)計(jì)Apache/Nginx日志中某一天的PV量 <統(tǒng)計(jì)日志>
# grep '27/Jul/2017' mysqladmin.cc-access_log |wc -l
14519
統(tǒng)計(jì)Apache/Nginx日志中某一天不同IP的訪問量 <統(tǒng)計(jì)日志>
# grep '27/Jul/2017' mysqladmin.cc-access_log |awk '{ips[$1]++};END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head
# grep '07/Aug/2017' access.log |awk '{ips[$1]++};END{for(i in ips){print i,ips[i]} }' |awk '$2>100' |sort -k2 -rn
名詞解釋:
網(wǎng)站瀏覽量(PV)
名詞:PV=PageView (網(wǎng)站瀏覽量)
說(shuō)明:指頁(yè)面的瀏覽次數(shù),,用以衡量網(wǎng)站用戶訪問的網(wǎng)頁(yè)數(shù)量。多次打開同一頁(yè)面則瀏覽量累計(jì),。用戶每打開一個(gè)頁(yè)面便記錄1次PV,。
名詞:VV = Visit View(訪問次數(shù))
說(shuō)明:從訪客來(lái)到您網(wǎng)站到最終關(guān)閉網(wǎng)站的所有頁(yè)面離開,計(jì)為1次訪問,。若訪客連續(xù)30分鐘沒有新開和刷新頁(yè)面,,或者訪客關(guān)閉了瀏覽器,則被計(jì)算為本次訪問結(jié)束,。
獨(dú)立訪客(UV)
名詞:UV= Unique Visitor(獨(dú)立訪客數(shù))
說(shuō)明:1天內(nèi)相同的訪客多次訪問您的網(wǎng)站只計(jì)算1個(gè)UV,。
獨(dú)立IP(IP)
名詞:IP=獨(dú)立IP數(shù)
說(shuō)明:指1天內(nèi)使用不同IP地址的用戶訪問網(wǎng)站的數(shù)量。同一IP無(wú)論訪問了幾個(gè)頁(yè)面,,獨(dú)立IP數(shù)均為1
作業(yè)1:
1,、寫一個(gè)自動(dòng)檢測(cè)磁盤使用率的腳本,,當(dāng)磁盤使用空間達(dá)到90%以上時(shí),需要發(fā)送郵件給相關(guān)人員
2,、寫一個(gè)腳本監(jiān)控系統(tǒng)內(nèi)存和交換分區(qū)使用情況
作業(yè)2:
輸入一個(gè)IP地址,,使用腳本判斷其合法性:
必須符合ip地址規(guī)范,第1,、4位不能以0開頭,,不能大于255不能小于0
web服務(wù)器集群中總共有9臺(tái)機(jī)器,,上面部署的是Apache服務(wù),。由于業(yè)務(wù)不斷增長(zhǎng),每天每臺(tái)機(jī)器上都會(huì)產(chǎn)生大量的訪問日志,,現(xiàn)需要將每臺(tái)web服務(wù)器上的apache訪問日志保留最近3天的,,3天以前的日志轉(zhuǎn)儲(chǔ)到一臺(tái)專門的日志服務(wù)器上,已做后續(xù)分析,。如何實(shí)現(xiàn)每臺(tái)服務(wù)器上只保留3天以內(nèi)的日志,?
|