筆者Q:972581034 交流群:605799367。有任何疑問可與筆者或加群交流
知識點:
- 記錄與字段
- 模式匹配:模式與動作
- 基本的awk執行過程
- awk常用內置變量(預定義變量)
- awk數組
- awk語法:循環、條件
- awk常用函數
- 向awk傳遞參數
- awk引用shell變量
- awk小程序及調試思路
[root@ctg ~]# awk --version|head -1
GNU Awk 3.1.7
第1章 記錄和字段
record記錄行, field字段相當於列,字段列。
awk對每個要處理的輸入數據認為都是具有格式和結構的,而不僅僅是一堆字符串。默認情況下,每一行內容都是一條記錄,並以換行符分隔(\n)結束
1.1記錄分隔符-RS
awk默認情況下每一行都是一個記錄(record)
RS
即 record separator輸入數據記錄分隔符,每一行是怎么沒的,表示每個記錄輸入的時候的分隔符,即行與行之間如何分隔。
NR
即number of record記錄(行)號,表示當前正在處理的記錄(行)的號碼
ORS即output record separator輸出記錄分隔符
awk使用內置變量RS來存放輸入記錄分隔符,RS表示的是輸入的記錄分隔符,這個值可以通過BEGIN模塊重新定義修改。
小結:
gawk
RS=行分隔符(記錄分隔符)
ORS=輸出記錄分隔符
FS=字段分隔符(列分隔符)
OFS=輸出字段分隔符
$0=整個記錄
NF= 列數
NR= 行數
在{print ,}中,逗號的意思是OFS
BEGIN:主要用來定義內置變量.
1.2 對$0的認識
awk$0表示整行,其實awk使用$0來表示整條記錄。記錄分隔符
1.3 企業面試題
統計下面文件里單詞出現的次數並排序
由sed -r 's#[^a-Z]+# #g' /etc/passwd > /root/tongji.txt 創建
解答:
awk 'BEGIN{RS="[^a-zA-Z]"}{print $0}' tongji.txt |sort |uniq -c|sort -rn
1.4 awk記錄知識小結:
- NR(number of record)存放着每個記錄的號(行號)讀取新行時候會自動+1
- RS(record separator)是輸入數據的記錄的分隔符,簡單理解就是可以指定每個記錄的結尾標志
- RS作用就是表示一個記錄的結束
- 當我們修改了RS的值,最好配合NR(行)來查看變批,也就是修改了RS的值通過NR查看結果,調試awk程序
- ORS輸出數據的記錄的分隔符
1.5 字段(列)
FS即field separator,輸入字段(列)分隔符。分隔符就是菜刀,把一行字符串切為很多個區域
NF即 number of fileds,表示一行中列(字段)的個數,可以理解為菜刀切過一行后,切成了多少份
OFS輸出字段(列)分隔符
awk使用內置變量FS來記錄區域分隔符的內容,FS可以在命令行上通過-F參數來更改,也可以通過BEGIN模塊來更改
然后通過$n,n是整數,來取被切割后的區域,
3.6 ORS與OFS簡介
RS是輸入記錄分隔符,決定awk如何讀取或分割每行(記錄)
ORS表示輸出記錄分隔符,決定awk如何讀取或分割每行(記錄)
FS是輸入區域分隔符,決定awk輸出每個區域的時候使用什么分割他們。
awk無比強大,你可以通過RS,FS決定awk如何讀取數據。你也可以通過修改ORS,OFS的值指定awk如何輸出數據。
{print ,}這里面的逗號等於OFS的值
RS=行分隔符(記錄分隔符)
ORS=輸出記錄分隔符
FS=字段分隔符(列分隔符)
OFS=輸出字段分隔符(OFS的值等於逗號)
$0=整個記錄
3.7 題目
按單詞出現頻率降序排序
[root@ctg files]# cat count.txt
root x root root bin bash
bin x bin bin sbin nologin
daemon x daemon sbin sbin nologin
adm x adm var adm sbin nologin
lp x lp var spool lpd sbin nologin
sync x sync sbin bin sync
shutdown x shutdown sbin sbin shutdown
halt x halt sbin sbin halt
mail x mail var spool mail sbin nologin
uucp x uucp var spool uucp sbin nologin
解答:
sed 's# #\n#g' count_word.txt|sort |uniq -c
tr " " "\n" < count_word.txt|sort |uniq -c
awk 'BEGIN{RS=" "}{print $0}' count_word.txt|sort |uniq -c
egrep -o "[a-z]+" count_word.txt|sort |uniq -c
xargs -n1 <awk_blank.txt|sort |uniq -c
awk 'BEGIN{RS=" "}{print $0}' awk_blank.txt|sort |uniq -c
egrep -o "[a-zA-Z0-9]+" awk_blank.txt|sort |uniq -c
第2章 awk進階
2.1 awk的模式
正則表達式作為模式
比較表達式作為模式
范圍模式
特殊模式BEGIN和END
awk的模式是你玩好awk的必備也是最基礎的內容,必須熟練掌握
2.1 練習題:
mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF
顯示姓Zhang的人的第二次捐款金額及她的名字
[root@ctg files]# awk -F "[ :]+" '$1~/Zhang/{print $(NF-1)}' reg.txt
100
90
顯示Xiaoyu的姓氏和ID號碼
[root@oldboy34-niubility files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt
Zhang Xiaoyu 390320151
顯示所有以41開頭的ID號碼的人的全名和ID號碼
[root@oldboy34-niubility files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
顯示所有以一個D或X開頭的人名全名
[root@oldboy34-niubility files]# awk '$2~/^[DX]/{print $1,$2}' reg.txt
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
顯示所有ID號碼最后一位數字是1或5的人的全名
[root@oldboy34-niubility files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
顯示Xiaoyu的捐款.每個值時都有以$開頭.如$520$200$135
[root@ctg files]# awk '/Xiaoyu/{print $NF}' reg.txt |tr ":" "$"
$155$90$201
[root@ctg files]# awk -F "[ :]+" 'BEGIN{OFS="$"}/Xiaoyu/{print "",$4,$5,$6}' reg.txt
$155$90$201
awk '{gsub(/:/,"$");print $NF}' reg.txt
顯示所有人的全名,以姓,名的格式顯示,如Meng,Feixue
[root@ctg files]# awk '{print $1","$2}' reg.txt
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai
取出下面不是oldboy的行 (匹配結果需包含oldboy linux )
cat >>/server/files/zhuanyedian.txt <<EOF
lidao
oldboy
oldboylinux
zhangdao
xiadao
EOF
[root@oldboy34-niubility files]# awk '$0!~/oldboy$/' zhuanyedian.txt
lidao
oldboylinux
zhangdao
xiadao
2.2 gsub替換函數
[root@ctg test]# cat reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390330151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918381635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@ctg test]# awk '{gsub(/:/,"$");print $NF}' reg.txt
$250$100$175
$155$90$201
$250$60$50
$250$80$75
$250$100$175
$50$95$135
$250$168$200
$175$75$300
$250$100$175
[root@oldboy34-niubility files]# #sed 's###g'
[root@oldboy34-niubility files]# #gsub awk中 進行查找替換 功能 命令 函數
[root@oldboy34-niubility files]# #gsub(/正則表達式/,"替換成什么") #把一行內
[root@oldboy34-niubility files]# #gsub(/正則表達式/,"替換成什么",$2) #把$2第二列里面的 內容替換成xxx
[root@oldboy34-niubility files]#
[root@oldboy34-niubility files]# echo oldboy linux |awk '{gsub(/oldboy/,"oldgirl")}'
[root@oldboy34-niubility files]# echo oldboy linux |awk '{gsub(/oldboy/,"oldgirl");print }'
oldgirl linux
[root@oldboy34-niubility files]# cat
awkfile.txt count.txt oldboy.txt reg.txt zhuanyedian.txt
[root@oldboy34-niubility files]# cat reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboy34-niubility files]# awk '{gsub(/:/,"$",$NF);print }' reg.txt
Zhang Dandan 41117397 $250$100$175
Zhang Xiaoyu 390320151 $155$90$201
Meng Feixue 80042789 $250$60$50
Wu Waiwai 70271111 $250$80$75
Liu Bingbing 41117483 $250$100$175
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175
[root@oldboy34-niubility files]# awk '{gsub(/:/,"$",$NF);print }' reg.txt |column -t
Zhang Dandan 41117397 $250$100$175
Zhang Xiaoyu 390320151 $155$90$201
Meng Feixue 80042789 $250$60$50
Wu Waiwai 70271111 $250$80$75
Liu Bingbing 41117483 $250$100$175
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175
[root@ctg files]# awk '{gsub(/[a-zA-Z]/,"*");print}' reg.txt
***** ****** 41117397 :250:100:175
***** ****** 390320151 :155:90:201
**** ****** 80042789 :250:60:50
** ****** 70271111 :250:80:75
*** ******** 41117483 :250:100:175
**** ****** 3515064655 :50:95:135
** **** 1986787350 :250:168:200
** ****** 918391635 :175:75:300
*** ****** 918391635 :250:100:175
[root@ctg files]# awk '{gsub(/[a-zA-Z]/,"*",$1);print}' reg.txt
***** Dandan 41117397 :250:100:175
***** Xiaoyu 390320151 :155:90:201
**** Feixue 80042789 :250:60:50
** Waiwai 70271111 :250:80:75
*** Bingbing 41117483 :250:100:175
**** Xiaoai 3515064655 :50:95:135
** Gege 1986787350 :250:168:200
** Youjiu 918391635 :175:75:300
*** Nanhai 918391635 :250:100:175
2.3 比較表達式作為模式
之前我們看了正則表達式在awk下的運用,下面再具體看看比較表達式如何在awk下工作。
awk是一種編程語言,能夠進行更為復雜的判斷,當條件為真的時候,awk就執行相關的action。主要是在針對某一區域做出相關的判斷,比如打印成績在80分以上的行,這樣就必須對這一個區域做比較判斷,下表中列出了awk可以使用的關系運算符,可以用來比較數字或者字符串,還有正則表達式。當表達式為真時,表達式結果為1,否則為0,只有表達式為真,awk才執行相關的action
|運算符 含義 示例
< 小於 x>y
<= 小於等於 x<=y
== 等於 x==y
!= 不等於 x!=y
>= 大與或等於 x>=y
> 大於 x<y
以上的運算符均是針對數字,下面兩個運算符針對字符串
~ 與正則表達式匹配 x~/y/
!~ 與正則表達式不匹配 x!~y
2.4 說明
awk在輸出整行既$0的時候,僅僅是原封不動的輸出整行,沒有任何修改。這就造成一個問題,如果我修改了OFS,那么輸出整行的時候print $0的時候,也不會有任何改變。即:如果awk的action動作沒有更改行的內容,OFS(包括ORS)都不會生效。
所以我們需要讓awk知道$0被修改了,這一個事情。
$1=$1是把$1的值賦值給$1,這顯然不會修改任何內容,但是這個動作會通知awk我修改了$1的內容,所以再次修改print $0的時候,$0的內容就變化了。
這是一個小技巧
2.5 awk特殊模式-BEGIN模式與END模式
2.5.1 BEGIN模塊
BEGIN模塊在awk讀取文件之前就執行,一般用來定義我們的內置變量(預定義變量,eg:FS, RS),可以輸出表頭(類似excel表格名稱)
BEGIN模式之前我們有在示例中提到,自定義變量,給內容變量賦值等,都使用過。需要注意的是BEGIN模式后面要接跟一個action操作塊,包含在大括號內。awk必須在對輸入文件進行任何處理前先執行BEGIN里的動作(action)。我們可以不要任何輸入文件,就可以對BEGIN模塊進行測試,因為awk需要先執行完BEGIN模式,才對輸入文件做處理.BEGIN模式常常被用來修改內置變量ORS,RS,FS,OFS等的值.
[root@ctg ~]# awk 'BEGIN{FS=":";print "username","UID","password"}NR==1{print $1,$2,$3}' /etc/passwd|column -t
username UID password
root x 0
2.5.2 awk中變量的概念簡介
直接定義,直接使用即可
awk中字母會被認為是變量,如果真的要給一個變量賦值字母(字符串),請使用雙引號。
2.6.3 END模式
END在awk讀取完所有的文件的時候,再執行END模塊,一般用來輸出一個結果(累加,數組結果),也可以是和BEGIN模塊類似的結尾標識信息。
[root@ctg test]# awk 'BEGIN{print "hello world"}{print NR,$0}END{print "end of file"}' reg.txt
hello world
1 Zhang Dandan 41117397 :250:100:175
2 Zhang Xiaoyu 390330151 :155:90:201
3 Meng Feixue 80042789 :250:60:50
4 Wu Waiwai 70271111 :250:80:75
5 Liu Bingbing 41117483 :250:100:175
6 Wang Xiaoai 3515064655 :50:95:135
7 Zi Gege 1986787350 :250:168:200
8 Li Youjiu 918381635 :175:75:300
9 Lao Nanhai 918391635 :250:100:175
end of file
與BEGIN模式相對應的END模式,格式一樣,但是END模式僅在awk處理完所有輸入行后才進行處理。
3.1 awk中的動作
在一個模式-動作語句中,模式決定動作什么時候執行,有時候動作會非常簡單:一條單獨的打印或賦值語句,在有些時候,動作有可能是多條語句,語句之間用換行符或分號分開。
awk的動作中如果有兩個或兩個以上的語句,需要用分號分隔。
動作部分理解為花括號里面的內容即可,總體分為:
表達式
流程控制語句
空語句
數組
4.1 計算從一加到100
[root@ctg ~]# awk '{i+=$1;print i-$1"+"$1"="i}' count.txt
0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
15+6=21
21+7=28
28+8=36
36+9=45
45+10=55
4.2 awk模式與動作小結:
awk命令核心由模式和動作組成,就是找誰{干啥}
模式就是條件,動作就是具體干什么
正則表達式:必須掌握正則,熟練
條件表達式:比大小,比較是否相等
范圍表達式:從哪里來到哪里支
注意BEGIN或END模塊只能有一個。BEGIN{}BEGIN或者END{}END都是錯誤的。
找誰干啥模塊,可以是多個。
'NR2{print $1}NR5{print $0}'
awk -F ":" 'NR1{print NR,$0}NR2{print NR,$NF}' awkfile.txt
4.3 awk執行過程
A. 命令行的賦值(-F或-v)
B. 執行BEGIN模式里面的內容
C. 開始讀取文件
D. 判斷條件(模式)是否成立
成立則執行對應動作里面的內容
讀取下一行,循環判斷
真到讀取到最后一個文件的結尾
E.最后執行END模式里面的內容
F.結束
思想:
- awk核心思想就是先處理,然后END模塊輸出。(累加(a++;a+=$0),awk數組)
- BEGIN模塊用於awk內置變量FS,RS的賦值,打印標題頭的信息。(excel表格里面標題行)
要在awk執行前,定義好。 - END模塊用來最后輸出,統計信息,awk數組信息,(累加(a++;a+=$0),awk數組)
- 字段(列),記錄(行)
4.4 調試工具
[root@oldboy34-niubility files]# pgawk 'BEGIN{print "i=i+$1"}NR==1{i+=$1;print i-$1"+"$1"="i}' count_lei.txt |head
i=i+$1
0+1=1
[root@oldboy34-niubility files]# cat awkprof.out
# gawk profile, created Wed Mar 1 17:21:06 2017
# BEGIN block(s)
BEGIN {
1 print "i=i+$1"
}
# Rule(s)
100 NR == 1 { # 1
1 i += $1
1 print ((i - $1) "+" ($1) "=" i)
}
4.5 awk數組
警察查房,for(pol in hotel) 查完后pol知道了房間號碼,並知道了里面的內容,
[root@ctg ~]# awk 'BEGIN{hotel[110]="xiaoyu";hotel[119]="tandao";hotel[121]="feixue";for(pol in hotel){print pol,hotel[pol]}}'
110 xiaoyu
121 feixue
119 tandao
小結:
awk數組是分析日志最常用的功能,也是玩轉awk必會的部分。
1.awk數組的名字就像酒店的名字一樣
2.awk數組的元素名字就像房間號碼,房間號碼用的一般就是你想要處理的東西,比如統計ip地址,比如統計url。可以把ip,url作為房間號碼。
3.awk數組的元素的內容就像房間里面住的人,一般就是放的我們想要的結果,或者計算的結果。即把計算結果放在房間中。
4.遇到awk數組的處理一般都是進行統計,這時候我們會把最后的結果在END模塊里面輸出。
5.輸出顯示awk數組的結果,就是顯示房間里面的內容,即查房。
6.awk的查房是通過for(pol in hotel)這種形式來完成的。for表示循環,pol表示警察是一個變量名字,in表示去查房,hotel表示酒店名稱,合起來就是警察去酒店查房,查完一個繼續查下一個。
7.在查房過程中pol警察知道房間號碼,也就是說pol變量中的內容是房間號碼。
8.要看房間中的內容,首先要知道酒店名稱,然后就是房間號碼即,hotel[pol]
9.要熟練使用awk數組在開始的時候就要學會一步一步看awk如何執行的即可。
4.6 企業面試題1
[root@ctg test]# cat www.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print i}' www.txt
mp3.etiantian.org
post.etiantian.org
www.etiantian.org
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print a[i]}' www.txt
1
2
3
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print a[i],i}' www.txt
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print i,a[i]}' www.txt
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
4.7 企業面試題2
考試題3.分析圖片服務日志,把日志(每個圖片訪問次數*圖片大小的總和)排行,取top10,也就是計算每個url的總訪問大小【附加題:加分題】。
所有同學都可以忽略此題答案,學完課程自然就理解了。
說明:本題生產環境應用:這個功能可以用於IDC網站流量帶寬很高,然后通過分析服務器日志哪些元素占用流量過大,進而進行優化或裁剪該圖片,壓縮js等措施。
本題需要輸出三個指標: 【訪問次數】 【訪問次數*單個文件大小】 【文件名(可以帶URL)】
[root@ctg files]# awk 'BEGIN{print "訪問次數","文件名","訪問次數*單個文件大小"}{i[$7]++}END{for(a in i){print i[a],a,$10*i[a]/1024"k"}}' url.txt |sort -n|column -t
訪問次數 文件名 訪問次數*單個文件大小
1 /?= 133.535k
1 /mobile/static/common/src/loadingimg.gif 133.535k
1 /mobile/theme/oldboyedu/home/images/150309/act_28.jpg 133.535k
1 /mobile/theme/oldboyedu/home/images/20150628/6.jpg 133.535k
1 /mobile/theme/oldboyedu/home/images/placeholder.jpg 133.535k
1 /online/oldboyeduonline/images/ajaxIndicator.gif 133.535k
1 /static/flex/vedioLoading.swf 133.535k
1 /static/js/jquery.lazyload.js 133.535k
1 /static/js/web_js.js 133.535k
2 /mobile/theme/oldboyedu/home/images/oldboy_logo.png 267.07k
2 /static/images/photos/2.jpg 267.07k
3 /mobile/theme/oldboyedu/home/images/20151111/home3.png 400.605k
第一個里程碑-統計url/路徑的重復數量。
[root@oldboy34-niubility files]# awk '{hotel[$7]++}END{for(pol in hotel)print pol,hotel[pol]}' 12ti.txt |sort -rnk2
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3
/static/images/photos/2.jpg 2
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2
/static/js/web_js.js 1
/static/js/jquery.lazyload.js 1
/static/flex/vedioLoading.swf 1
/online/oldboyeduonline/images/ajaxIndicator.gif 1
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1
/mobile/static/common/src/loadingimg.gif 1
/?= 1
[root@oldboy34-niubility files]# awk '{hotel[$7]++}END{for(pol in hotel)print pol,hotel[pol]}' 12ti.txt |sort -rnk2|column -t
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3
/static/images/photos/2.jpg 2
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2
/static/js/web_js.js 1
/static/js/jquery.lazyload.js 1
/static/flex/vedioLoading.swf 1
/online/oldboyeduonline/images/ajaxIndicator.gif 1
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1
/mobile/static/common/src/loadingimg.gif 1
/?= 1
第二個里程碑-化簡問題:
1.jpg 2000
1.jpg 2000
1.jpg 2000
1.jpg 被訪問了3次 *2000 6000
6000=2000+2000+2000
訪問次數*單個文件大小 相同的url/路徑把對應的$10 大小 進行相加。
進行相加的時候 房間號碼用什么?
$7
[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}' 12ti.txt
[root@oldboy34-niubility files]# ###兩個酒店房間號碼一樣。
[root@oldboy34-niubility files]# ###想取出兩個酒店房間里面的內容。
[root@oldboy34-niubility files]# ###1.酒店名稱 hotel sum
[root@oldboy34-niubility files]# ###2.房間號碼
[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in hotel) print pol,hotel[pol],sum[pol] }' 12ti.txt
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1 31941
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1 4722
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3 410220
/?= 1 46232
/online/oldboyeduonline/images/ajaxIndicator.gif 1 0
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2 43816
/mobile/static/common/src/loadingimg.gif 1 20246
/static/js/web_js.js 1 4460
/static/images/photos/2.jpg 2 22598
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1 17283
/static/flex/vedioLoading.swf 1 3583
/static/js/jquery.lazyload.js 1 1627
[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in hotel) print pol,hotel[pol],sum[pol] }' 12ti.txt |column -t
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1 31941
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1 4722
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3 410220
/?= 1 46232
/online/oldboyeduonline/images/ajaxIndicator.gif 1 0
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2 43816
/mobile/static/common/src/loadingimg.gif 1 20246
/static/js/web_js.js 1 4460
/static/images/photos/ 2.jpg 2 22598
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1 17283
/static/flex/vedioLoading.swf 1 3583
/static/js/jquery.lazyload.js 1 1627
方法一:初級入學版本:
awk '{count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
方法二:高級只統計圖片版本:
awk '$7~/(jpg|jpeg|png|gif)$/{count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
方法三:高級只統計圖片版本不計算緩存版本。
awk '$7~/(jpg|jpeg|png|gif)$/ && $9 != 304 {count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
方法四:完全符合題意的答案
awk '$7~/(jpg|jpeg|png|gif)$/ && $9 != 304 {count[$7]++;size[$7]=$10}END{for(pol in count)print count[pol],count[pol]*size[pol],pol}' nginx-12.log
第5章 擴展
5.1 分裂split
取出bash的版本號。 范圍 變量從哪里開始分割
[root@ctg ~]# bash --version|awk 'NR==1{split($(NF-1),a,"\\(");print a[2]}'
1)-release
[root@ctg ~]# bash --version|awk 'NR==1{split($(NF-1),a,"\\(");print a[1]}'
[root@ctg ~]# bash --version|awk 'NR==1 {gsub(/-release/,"");{print $4}}'
4.1.2(1)
以冒號為分隔符,把/etc/passwd的第一列替換為ABC
[root@yum ~]# awk -F: 'sub($1,"ABC")' /etc/passwd
ABC:x:0:0:root:/root:/bin/bash
ABC:x:1:1:bin:/bin:/sbin/nologin
ABC:x:2:2:daemon:/sbin:/sbin/nologin
ABC:x:3:4:adm:/var/adm:/sbin/nologin
ABC:x:4:7:lp:/var/spool/lpd:/sbin/nologin
ABC:x:5:0:sync:/sbin:/bin/sync
ABC:x:6:0:shutdown:/sbin:/sbin/shutdown
ABC:x:7:0:halt:/sbin:/sbin/halt
ABC:x:8:12:mail:/var/spool/mail:/sbin/nologin
ABC:x:11:0:operator:/root:/sbin/nologin
ABC:x:12:100:games:/usr/games:/sbin/nologin
ABC:x:14:50:FTP User:/var/ftp:/sbin/nologin
ABC:x:99:99:Nobody:/:/sbin/nologin
ABC:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
ABC:x:999:997:systemd Bus Proxy:/:/sbin/nologin
ABC:x:998:996:systemd Network Management:/:/sbin/nologin
[root@yum ~]# awk -F: '$1="ABC"' /etc/passwd
ABC x 0 0 root /root /bin/bash
ABC x 1 1 bin /bin /sbin/nologin
ABC x 2 2 daemon /sbin /sbin/nologin
ABC x 3 4 adm /var/adm /sbin/nologin
ABC x 4 7 lp /var/spool/lpd /sbin/nologin
ABC x 5 0 sync /sbin /bin/sync
ABC x 6 0 shutdown /sbin /sbin/shutdown
ABC x 7 0 halt /sbin /sbin/halt
ABC x 8 12 mail /var/spool/mail /sbin/nologin
ABC x 11 0 operator /root /sbin/nologin
ABC x 12 100 games /usr/games /sbin/nologin
ABC x 14 50 FTP User /var/ftp /sbin/nologin
ABC x 99 99 Nobody / /sbin/nologin
ABC x 170 170 Avahi IPv4LL Stack /var/lib/avahi-autoipd /sbin/nologin
ABC x 999 997 systemd Bus Proxy / /sbin/nologin
awk取最后行
awk 'END{print $NF}' test.txt
李導博客: http://blog.51cto.com/lidao/1914205
原創作品,請勿轉載 http://www.cnblogs.com/Csir/