Linux運(yùn)維學(xué)習(xí) Day19
Ⅰ.三劍客命令awk
1.概述
gawk : pattern scanning and processing language
可以進(jìn)行模式掃描 和 是一門語(yǔ)言
語(yǔ)法 : awk [參數(shù)] '模式{動(dòng)作}' 文件
sed [參數(shù)] '條件 指令' 文件信息
2.三劍客命令awk作用
處理文件信息: ①文本文件信息
②日志文件信息
③配置文件信息
處理文件方式: ①排除信息
②查詢信息
③統(tǒng)計(jì)信息
④替換信息
⑤對(duì)文件列進(jìn)行處理
Ⅱ.三劍客命令awk操作
實(shí)際操作演練: 創(chuàng)建測(cè)試環(huán)境
[root@oldboyedu ~]# 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
1.顯示xiaoyu的姓氏和ID號(hào)碼
awk '{print $1 $3}' 文件信息
第一個(gè)步驟: 找出需要編寫模式信息
獲取xiaoyu信息
awk '/Xiaoyu/' reg.txt
awk '$2~/Xiaoyu/' reg.txt
第二個(gè)步驟: 根據(jù)條件做處理
顯示滿足條件的第三列和第一列信息
awk '$2~/Xiaoyu/{動(dòng)作}' reg.txt
awk '$2~/Xiaoyu/{print $1 $3}' reg.txt
答案:
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $1" "$3}' reg.txt
Zhang 390320151
2. 姓氏是Zhang的人,顯示他的第二次捐款金額及他的名字
第一個(gè)步驟: 找出需要編寫模式信息
awk '$1~/Zhang/' reg.txt
第二個(gè)步驟: 根據(jù)條件做處理
awk '$1~/Zhang/{print $1,$2,$4}' reg.txt
awk -F ":" '$1~/Zhang/{print $3}' reg.txt
答案:
[root@oldboyedu ~]# awk -F "[: ]+" '$1~/Zhang/{print $1,$2,$5}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90
3.顯示所有以41開(kāi)頭的ID號(hào)碼的人的全名和ID號(hào)碼
第一個(gè)步驟: 找出需要編寫模式信息
awk '$3~/^41/' reg.txt
第二個(gè)步驟: 根據(jù)條件做處理
答案:
awk '$3~/^41/{print $1,$2,$3}' reg.txt
[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt|column -t
Zhang Dandan 41117397
Liu Bingbing 41117483
4.顯示所有ID號(hào)碼最后一位數(shù)字是1或5的人的全名
第一個(gè)步驟: 找出需要編寫模式信息
awk '$3~/1$|5$/' reg.txt
awk '$3~/[15]$/' reg.txt
awk '$3~/(1|5)$/' reg.txt
第二個(gè)步驟: 根據(jù)條件做處理
答案:
[root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' reg.txt|column -t
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
[root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2,$3}' reg.txt|column -t
Zhang Xiaoyu 390320151
Wu Waiwai 70271111
Wang Xiaoai 3515064655
Li Youjiu 918391635
Lao Nanhai 918391635
5.獲取文件中有井號(hào)或空行的內(nèi)容, 將空行和井號(hào)信息的行排除
第一個(gè)步驟: 找出需要編寫模式信息
awk '/#|^$/' reg.txt
awk '$0~/#|^$/' reg.txt
說(shuō)明: $0 表示將文件所有列信息進(jìn)行顯示
awk '$0!~/#|^$/' reg.txt
awk '!/#|^$/' reg.txt
第二個(gè)步驟: 根據(jù)條件做處理
答案:
[root@oldboyedu ~]# awk '$0!~/#|^$/' reg.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai Xiaoyu :250:100:175
[root@oldboyedu ~]# awk '$0!~/#|^$/{print $0}' reg.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai Xiaoyu :250:100:175
6.顯示Xiaoyu的捐款,每個(gè)捐款數(shù)額都是以美元符號(hào)開(kāi)頭
awk '$2~/Xiaoyu/{print $4}' reg.txt|sed 's#:#$#g'
awk '$2~/Xiaoyu/{print $4}' reg.txt|tr ':' '$'
awk -F "[: ]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt
awk替換
gsub = gawk substitute
gsub(/要替換的信息/,"替換成什么".$將第幾列)
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201
說(shuō)明: $NF 表示文件的最后一列信息
Ⅲ.awk命令模式分類
1.普通模式: 比較行信息
[root@oldboyedu ~]# 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@oldboyedu ~]# awk 'NR>2' reg.txt
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@oldboyedu ~]# awk 'NR<2' reg.txt
Zhang Dandan 41117397 :250:100:175
說(shuō)明: NR 表示文件行信息
2.取出多行信息
[root@oldboyedu ~]# awk 'NR==2,NR==4' reg.txt --- 連續(xù)多行
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
[root@oldboyedu ~]# awk 'NR==2;NR==4' reg.txt --- 不連續(xù)多行
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
3.特殊模式
(1)BEGIN{動(dòng)作}: 在處理文件之前,先做什么事情
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","號(hào)碼","捐款記錄"}{print $0}' reg.txt|column -t
姓 名 號(hào)碼 捐款記錄
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
(2)用于計(jì)算:
[root@oldboyedu ~]# awk "BEGIN{print 2+2}"
4
[root@oldboyedu ~]# awk "BEGIN{print 2-2}"
0
[root@oldboyedu ~]# awk "BEGIN{print 2*2}"
4
[root@oldboyedu ~]# awk "BEGIN{print 3/2}"
1.5
[root@oldboyedu ~]# awk "BEGIN{print 3^2}"
9
[root@oldboyedu ~]# awk "BEGIN{print 3^3}"
27
[root@oldboyedu ~]# awk "BEGIN{print 3**3}"
27
[root@oldboyedu ~]# awk "BEGIN{print 5%3}"
2
(3)修改內(nèi)置變量:
NF: 取出最后一列
# awk '{print $(NF-1)}' reg.txt --- 取出倒數(shù)第二列
NR: 表示行信息
FS: 指定列分隔符, 默認(rèn)識(shí)別空格為分割符
[root@oldboyedu ~]# awk 'BEGIN{FS="[: ]+"}{print $4}' reg.txt
250
155
250
250
250
50
250
175
250
[root@oldboyedu ~]# awk -vFS="[: ]+" '{print $1,$4}' reg.txt
Zhang 250
Zhang 155
Meng 250
Wu 250
Liu 250
Wang 50
Zi 250
Li 175
Lao 250
(4)END{動(dòng)作}: 在處理文件之后,再做什么事情
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","號(hào)碼","捐款記錄"}{print $0}END{print "學(xué)生捐款登記表"}' reg.txt|column -t
姓 名 號(hào)碼 捐款記錄
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
學(xué)生捐款登記表
實(shí)際作用:可以將統(tǒng)計(jì)后的最終結(jié)果進(jìn)行輸出
Ⅳ.awk對(duì)文件進(jìn)行統(tǒng)計(jì)分析
1.awk統(tǒng)計(jì)運(yùn)算公式
(1)文本信息累加運(yùn)算
i=i+1
統(tǒng)計(jì)文件行數(shù)
awk '{i=i+1}END{print i}' test.txt
[root@oldboyedu ~]# awk '/oldboy/{i=i+1}END{print i}' test.txt
4
[root@oldboyedu ~]# awk '/oldboy/{i++}END{print i}' test.txt
4
(2)數(shù)值信息求和運(yùn)算
sum=sum+$n $n 你要對(duì)文件第幾列信息做求和運(yùn)算
# seq 10|awk '{sum=sum+$1}END{print sum}'
55
2.練習(xí)題:找出有faild信息, 總共出現(xiàn)了多少次 (awk統(tǒng)計(jì))
難點(diǎn): windows文件如何傳輸?shù)絣inux系統(tǒng)
yum install -y lrzsz --- 實(shí)現(xiàn)windows和linux系統(tǒng)之間數(shù)據(jù)傳輸
rz -- 將windows數(shù)據(jù) ---> linux系統(tǒng)
sz -- 將linux數(shù)據(jù) ---> windows系統(tǒng)
awk '/Failed/{i++}END{print i}' secure-20161219
awk '$6~/Failed/{i++}END{print i}' secure-20161219'