1. awk三劍客命令概述
? ? ? ? ? ? # which awk--------查看awk在哪個(gè)目錄下
顯示:? /usr/bin/awk
? ? ? ? ? ? # ll /usr/bin/awk
顯示: lrwxrwxrwx. 1 root root 4 May 31 16:06 /usr/bin/awk -> gawk? ? ------查看awk更詳細(xì)的信息
? ? ? ? ? ? # man awk
顯示: gawk - pattern scanning and processing language
? ? ? ? ? ? 解析: 模式掃描(條件匹配)and 程序語(yǔ)言
awk: 擅長(zhǎng)取列? 擅長(zhǎng)統(tǒng)計(jì)分析(nginx zabbix tomcat ... SSH)ELK awk
03. awk三劍客命令執(zhí)行原理
? ? 參見示意圖
04. awk三件可命令語(yǔ)法結(jié)構(gòu)
? ? awk [參數(shù)] '模式(條件){動(dòng)作}(指令)'? 文件信息
05. awk三劍客命令實(shí)踐操作:查詢 排除 替換
? ? 部署準(zhǔn)備環(huán)境
cat > oldboy.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
2. 實(shí)踐操作練習(xí):
? ? 01. 顯示xiaoyu的姓氏和ID號(hào)碼
? ? # awk '/Xiaoyu/{print $1 $3}' oldboy.txt
? ? Zhang390320151
? ? # awk '/Xiaoyu/{print $1,$3}' oldboy.txt
? ? Zhang 390320151
? ? # awk '/Xiaoyu/{print $1" "$3}' oldboy.txt
? ? Zhang 390320151
? ? 按照指定列進(jìn)行搜索信息Xiaoyu? ? ? ? 問題是內(nèi)容中有兩個(gè)Xiaoyu
? ? # awk '/Xiaoyu/' oldboy.txt? ? ? ? --- 將匹配信息的行直接顯示
? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
? ? Xiaoyu zhang? ? 390320151? :155:90:201
? ? # awk '$2~/Xiaoyu/' oldboy.txt? ? --- 指定列信息匹配? 解決方法
? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
? ? # awk '$2!~/Xiaoyu/' oldboy.txt? ? ----表示將指定列信息取返
? ? Zhang? Dandan? ? 41117397? ? :250:100:175
? ? Xiaoyu zhang? ? 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):滿足要求槽华,正確語(yǔ)法格式
? ? # awk '$2~/Xiaoyu/{print $1,$3}' oldboy.txt
? ? Zhang 390320151
PS:awk命令默認(rèn)區(qū)分大小寫不需要加i? ? 沒有類似grep命令 -i參數(shù)功能
? ? 02.姓氏是zhang的人,顯示他的第二次捐款金額及他的名字
? ? ? ? 第一歷程:找出姓氏是張的人
? ? ? ? # awk '$1~/Zhang/' oldboy.txt
? ? ? ? ? ? Zhang? Dandan? ? 41117397? ? :250:100:175
? ? ? ? ? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
? ? ? ? ? 第二歷程:顯示出名字信息 和所有捐款記錄
? ? ? ? ? # awk '$1~/Zhang/{print $2,$4}' oldboy.txt
? ? ? ? ? Dandan :250:100:175
? ? ? ? ? Xiaoyu :155:90:201
PS:在使用-F的參數(shù)下融痛,awk默認(rèn)使用空格進(jìn)行作為列分隔符
? ? ? ? ? 第三歷程:指定字符信息作為分隔符
? ? ? ? ? # awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' oldboy.txt
? ? ? ? ? Dandan 100
? ? ? ? ? ? Xiaoyu 90
? ? 總結(jié):
01. awk默認(rèn)使用空格分隔列
02. 可以使用-F 指定分隔列的符號(hào)信息
03. 利用-F "[: ]+"? +表示將多個(gè)連續(xù)的分隔符匯總為一個(gè)整體
03. 顯示所有以41開頭的ID號(hào)碼的人的全名和ID號(hào)碼
第一個(gè)歷程:找出匹配id號(hào)碼是41開頭的行信息 --- 找出東西(模式寫好)
# awk '$3~/^41/' oldboy.txt
? ? ? ? ? ? ? ? ? Zhang? Dandan? ? 41117397? ? :250:100:175
? ? ? ? ? ? ? ? ? Liu? ? Bingbing? 41117483? ? :250:100:175
第二個(gè)歷程:顯示出人的全名 和 ID號(hào)碼? ? ? --- 對(duì)找出東西進(jìn)行處理(執(zhí)行動(dòng)作)
? ? ? ? ? ? ? ? ? ? # awk '$3~/^41/{print $1,$2,$3}' oldboy.txt|column -t
? ? ? ? ? ? ? ? ? ? Zhang? Dandan? ? 41117397
? ? ? ? ? ? ? ? ? ? Liu? ? Bingbing? 41117483
? ? 04. 顯示所有ID號(hào)碼最后一位數(shù)字是1或5的人的全名
第一個(gè)歷程:找出id號(hào)碼以1或5結(jié)尾信息? --- 找出信息
方法一:awk '$3~/1$|5$/' oldboy.txt
方法二:awk '$3~/[15]$/' oldboy.txt
第二個(gè)歷程:顯示全名信息? ? ? ? ? ? ? --- 找出信息做處理
awk '$3~/[15]$/{print $1,$2}' oldboy.txt|column -t
? ? 05. 顯示文件中第二行,第三列的信息
第一個(gè)歷程:匹配第二行
# awk 'NR==2' oldboy.txt
? ? ? ? ? ? ? ? ? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
第二個(gè)歷程:顯示第三列
awk 'NR==2{print $3}' oldboy.txt
? ? ? ? 測(cè)試. 利用awk取出IP地址信息(grep sed)
第一個(gè)歷程:定位有IP地址的行? ? ? ? ? --- 找出信息
ip a s eth0|awk 'NR==3'
? ? ? ? ? ? ? ? ? inet 10.0.0.201/24 brd 10.0.0.255 scope global eth0
第二個(gè)歷程:只顯示IP地址? ? ? ? ? ? ? --- 做處理? 為什么是三前面和后面都有隱藏一個(gè)^ $
ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
? ? ? ? ? ? ? ? ? 10.0.0.201
? ? 說(shuō)明:在不指定-F參數(shù)信息,
? ? ? 1. 默認(rèn)將多個(gè)連續(xù)的空格匯總為整體
? ? ? 2. 默認(rèn)將一行頭部開始空格信息忽略不計(jì)
? ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'
? ? ? ? ? ? ? ? ? ? 10.0.0.201
? 06. 顯示Xiaoyu的捐款,每個(gè)捐款數(shù)值都有以$開頭, 如$110$220$330
方法一:
# awk -F "[:]" '$2~/Xiaoyu/{print "$"$2"$"$3"$"$4}' oldboy.txt? 惦银??锥余?
? ? ? ? ? ? ? ? ? $155$90$201
方法二:
# awk? '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'
? ? ? ? ? ? ? ? ? $155$90$201
? ? ? ? ? ? ? ? # awk? '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"
? ? ? ? ? ? ? ? ? $155$90$201
? ? ? ? ? ? ? ? ? 方法三:awk替換功能? sed tr
gsub(/要替換的信息/,"替換成什么",將第幾列進(jìn)行替換)
# awk? '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt
? ? ? ? ? ? ? ? ? ? $155$90$201
? ? ? ? ? 07.利用awk排除指定信息不要顯示
awk '!/^$/' oldboy.txt
06. awk命令高級(jí)功能說(shuō)明:
? ? 普通模式? 正則表達(dá)式作為模式? ^ 還可以表示某一列的開始
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $ 還可以表示某一列的結(jié)尾
? ? 比較表達(dá)式作為模式:
? ? ? ? ? ? # awk 'NR==1{print $NF}' oldboy.txt
? ? ? ? ? ? ? :250:100:17
? ? 范圍模式:
? ? ? ? ? ? ? awk 'NR==1;NR==2' oldboy.txt? ? --- 只查看第1和第2行
? ? ? ? ? ? ? awk 'NR==1,NR==3' oldboy.txt? ? --- 查看第一到第三行
? ? 特殊模式? BEGIN? 在處理文件之前先執(zhí)行的動(dòng)作
? ? 1)生成文件內(nèi)容表頭信息
? ? ? ? ? # awk 'BEGIN{print "姓氏","名稱","id號(hào)碼","捐款記錄"}{print $0}' oldboy.txt |column -t
? ? ? ? ? ? ? 姓氏? ? 名稱? ? ? id號(hào)碼? ? ? 捐款記錄
? ? ? ? ? ? ? Zhang? Dandan? ? 41117397? ? :250:100:175
? ? ? ? ? ? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
? ? ? ? ? ? ? Xiaoyu? zhang? ? 390320151? :155:90:201
? ? ? ? ? ? ? Meng? ? Feixue? ? 800412789? :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)用于在系統(tǒng)中進(jìn)行運(yùn)算數(shù)值
awk 'BEGIN{print 2+3}'
? ? 3) 修改或設(shè)置變量信息
? ? ? ? ? a awk命令中躺苦,會(huì)直接將字符串信息當(dāng)成變量? $1 $NF $0(取一行中所有列)
? ? ? ? ? # awk 'BEGIN{oldboy=62;print oldboy}' -------設(shè)置變量
? ? ? ? ? ? ? ? 62
? ? ? ? ? # awk 'BEGIN{oldboy=62;print "oldboy"}' -----不想識(shí)別出變量
? ? ? ? ? ? ? ? oldboy
自定義變量:oldboy=62
內(nèi)置變量:
NF : 顯示最后一列信息? $(NF-1) 取倒數(shù)第2列
NR : 表示行號(hào)信息,取出第幾行? NR==2 NR>=2 NR<=2
FS : 指定分隔符信息? -F
? ? ? ? ? ? ? ? # awk -F ":" 'NR==1{print $2}' oldboy.txt
? ? ? ? ? ? ? ? 250
? ? ? ? ? ? ? ? # awk? 'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt
? ? ? ? ? ? ? ? 250
? ? ? ? ? ? ? ? # awk -vFS=":" 'NR==1{print $2}' oldboy.txt
? ? ? ? ? ? ? ? 250
? END? ? 在處理文件之后再執(zhí)行的動(dòng)作 ***
? ? ? ? ? 1)顯示表格補(bǔ)充信息
? ? ? ? ? ? # awk 'BEGIN{print "姓氏","名稱","id號(hào)碼","捐款記錄"}{print $0}END{print "總結(jié):這是一個(gè)學(xué)生登記表"}' oldboy.txt|column
? ? ? ? ? ? ? 姓氏 名稱 id號(hào)碼 捐款記錄
? ? ? ? ? ? ? Zhang? Dandan? ? 41117397? ? :250:100:175
? ? ? ? ? ? ? Zhang? Xiaoyu? ? 390320151? :155:90:201
? ? ? ? ? ? ? Meng? Feixue? ? 800412789? ? :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
? ? ? ? ? ? ? 總結(jié):這是一個(gè)學(xué)生登記表
? ? ? ? ? 2)顯示計(jì)算的最終結(jié)果 OK
? ? ? ? ? awk '/^$/{i=i+1}END{print i}' /etc/services
07. awk運(yùn)算方法:
? ? 1)累加運(yùn)算:a b c d? 1+1+1+1
? i=i+1 --> i++
? 練習(xí)題01:統(tǒng)計(jì)一個(gè)文件中有多少個(gè)空行
? 第一個(gè)歷程:找出空行
? awk '/^$/' /etc/services
? 第二個(gè)歷程:做運(yùn)算處理
? # awk '/^$/{i=i+1;print i}' /etc/services
? ? ? 1
? ? ? 2
? ? ? 3
? ? ? 4
? ? ? 5
? ? ? 6
? ? ? 7
? ? ? 8
? ? ? 9
? ? ? 10
? ? ? 11
? ? ? 12
? ? ? 13
? ? ? 14
? ? ? 15
? ? ? 16
? ? ? 17
? ? ? # awk '/^$/{i=i+1}END{print i}' /etc/services
? ? ? 17
? 練習(xí)題02:統(tǒng)計(jì)/etc/passwd文件中最后一列有/sbin/nologin的出現(xiàn)了多少次
? ? ? [# awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd
? ? ? 17
? ? ? # awk '/nologin$/{i++}END{print i}' /etc/passwd
? ? ? 17
? ? 2)求和運(yùn)算: 10 20 30 60
? i=i+$n
? ? ? 實(shí)踐操作:
? ? ? # seq 10|awk '{i=i+$1;print i}'
? ? ? 1
? ? ? 3
? ? ? 6
? ? ? 10
? ? ? 15
? ? ? 21
? ? ? 28
? ? ? 36
? ? ? 45
? ? ? 55
? ? ? # seq 10|awk '{i=i+$1}END{print i}'
? ? ? 55
08. 課程知識(shí)總結(jié):
? ? 1)awk三劍客命令概述
? 1)作用:擅長(zhǎng)取列 擅長(zhǎng)統(tǒng)計(jì)運(yùn)算
? 2)語(yǔ)法:awk 參數(shù) '模式{動(dòng)作}' oldboy.txt
? ? ? 模式:常用模式 特殊模式(BEGIN END)
? 3)原理:
2)awk三劍客命令練習(xí)
? 6道題? 查(匹配信息) 修改替換? 刪除
? awk命令參數(shù):
? -F? : 指定分隔符號(hào)信息? ":"? "[:/]"? "[:/]+"
? -v? : 設(shè)置變量信息
? awk命令動(dòng)作:
? print: 打印輸出信息? 空格 , " "? 字符串 "oldboy"? 變量信息? oldboy? 指定列 $1 $NF $(NF-1) $0(所有列)
? gsub:? 替換指定列的信息? gsub(/要替換的內(nèi)容/,"替換成什么",$N)
? 計(jì)算:
? 累加運(yùn)算:i=i+1? i++
? 求和運(yùn)算:i=i+$n ?
? awk內(nèi)置變量:
? FS NF NR