-
三劍客命令之a(chǎn)wk
awk
[root@oldboy63 ~]# ls -l ` which awk`
lrwxrwxrwx. 1 root root 4 Jul 13 15:25 /usr/bin/awk -> gawk
awk是gawk的軟鏈接
gawk ---- pattern scanning and processing language
模式掃描和處理文件語言
語法:awk [參數(shù)] '模式{動(dòng)作}' 文件
自己理解:'模式{動(dòng)作}' 這里好像是用單引號(hào),雙引號(hào)不支持
原理圖:
2.png
awk作用:
1.處理文件信息:文本文件信息 校读、日志文件信息谈宛、配置文件信息
2.處理文件方式:排除信息 、查詢信息、統(tǒng)計(jì)信息、替換信息、對(duì)文件列進(jìn)行處理
awk操作
創(chuàng)建測(cè)試環(huán)境
[root@oldboy63 ~]# 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
顯示xiaoyu的姓氏和ID號(hào)碼
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1" "$3}' reg.txt
Zhang 390320151
$n ---- 匹配第幾列
~ ----- 匹配信息
!~ ------將匹配的信息進(jìn)行取反
// -----指定匹配信息
姓氏是Zhang的人灾挨,顯示他的第二次捐款金額和他的名字
[root@oldboy63 ~]# awk -F '[: ]+' '$1~/Zhang/{print $1,$2,$5}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90
-F : 指定列分割符號(hào)(不指定符號(hào)默認(rèn)是空格)
顯示所有以41開頭的ID號(hào)碼的人的全名和ID號(hào)
[root@oldboy63 ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
[root@oldboy63 ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt|column -t
Zhang Dandan 41117397
Liu Bingbing 41117483
顯示所有ID號(hào)碼最后一位數(shù)字是1或5的人的全名
awk '$3~/1$|5$/' reg.txt
awk '$3~/[15]$/' reg.txt
awk '$3~/(1|5)$/' reg.txt
[root@oldboy63 ~]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
[root@oldboy63 ~]# awk '$3~/[15]$/{print $1,$2}' reg.txt |column -t
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
獲取文件中有井號(hào)或空行的內(nèi)容邑退,將空行和井號(hào)信息的行排除
第一個(gè)步驟: 找出需要編寫模式信息
awk '/#|^$/' reg.txt
awk '$0~/#|^$/' reg.txt
說明: $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
顯示Xiaoyu的捐款,每個(gè)捐款數(shù)額都是以110$220$330
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $4}' reg.txt |sed 's#:#$#g'
$155$90$201
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $4}' reg.txt|tr ':' '$'
$155$90$201
[root@oldboy63 ~]# awk -F "[: ]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt
$155 $90 $201
awk替換
gsub = gawk substitute
gsub(/要替換的信息/,"替換成什么".$將第幾列)
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201
說明:$NF 表示文件的最后一列信息
awk命令模式分類
[root@oldboy63 ~]# 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@oldboy63 ~]# awk 'NR<2' reg.txt
Zhang Dandan 41117397 :250:100:175
NR ---- 表示文件行信息
[root@oldboy63 ~]# 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@oldboy63 ~]# awk 'NR==2;NR==4' reg.txt -----取不連續(xù)多行
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
特殊模式:
BEGIN{動(dòng)作}:在處理文件之前地技,先做什么事情
[root@oldboy63 ~]# 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
用于計(jì)算:
[root@oldboy63 ~]# awk "BEGIN{print 2^2}"
4
[root@oldboy63 ~]# awk "BEGIN{print 2**2}"
4
[root@oldboy63 ~]# awk "BEGIN{print 2%2}"
0
[root@oldboy63 ~]# awk "BEGIN{print 2+2}"
4
[root@oldboy63 ~]# awk "BEGIN{print 2-2}"
0
[root@oldboy63 ~]# awk "BEGIN{print 3/2}"
1.5
修改內(nèi)置變量:
NF: 取出最后一列
[root@oldboy63 ~]# awk '{print $(NF-1)}' reg.txt
41117397
390320151
80042789
70271111
41117483
3515064655
1986787350
918391635
918391635
FS: 指定列分隔符, 默認(rèn)識(shí)別空格為分割符
[root@oldboy63 ~]# awk 'BEGIN{FS="[: ]+"}{print $4}' reg.txt
250
155
250
250
250
50
250
175
250
[root@oldboy63 ~]# 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
v ------ 指定變量信息
END{動(dòng)作}:在處理文件之后,再做什么事情
[root@oldboy63 ~]# 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é)生捐款登記表
awk對(duì)文件進(jìn)行統(tǒng)計(jì)分析
1.awk統(tǒng)計(jì)運(yùn)算公式
a.文本信息累加運(yùn)算
i=i+1
統(tǒng)計(jì)文件行數(shù)
awk '{i=i+1}END{print i}' test.txt
[root@oldboy63 ~]# cat >>test.txt<<EOF
> oldboy
> oldboy
> oldboy
> oldgirl
> Oldboy
> Oldbaby
> EOF
[root@oldboy63 ~]# awk '/oldboy/{i=i+1}END{print i}' test.txt
3
[root@oldboy63 ~]# awk '/oldboy/{i++}END{print i}' test.txt
3
b.數(shù)值信息求和運(yùn)算
sum=sum+$n(要對(duì)文件第幾列信息做求和運(yùn)算)
[root@oldboy63 ~]# seq 10|awk '{sum=sum+$1}END{print sum}'
55
[root@oldboy63 ~]# seq 10|awk '{print sum=sum+$1}'
1
3
6
10
15
21
28
36
45
55
統(tǒng)計(jì)日志錯(cuò)誤信息
awk '/Failed/{i++}END{print i}' secure-20161219
awk '$6~/Failed/{i++}END{print i}' secure-20161219'
windows文件如何傳輸?shù)絣inux系統(tǒng)
1.直接拖拽
2.yum install -y lrzsz --- 實(shí)現(xiàn)windows和linux系統(tǒng)之間數(shù)據(jù)傳輸
rz -- 將windows數(shù)據(jù) ---> linux系統(tǒng)