linux三剑客试题,linux三剑客-awk
第1章 awk指哪打哪
1.1 awk內(nèi)置變量
FS
輸入字段(列)分隔符
-F :
相當(dāng)于-vFS :
NR
number of record 行號(hào)(記錄號(hào))
NF
number of filed? 每行有多少列
OFS
output 輸出分隔符
RS
record separator 記錄分隔符每一的結(jié)束標(biāo)記 默認(rèn)是回車
IGNORECASE
是否忽略大小寫? 1為忽略
1.1.1 RS??? 記錄分隔符?? 每一的結(jié)束標(biāo)記默認(rèn)是回車
[root@zeq files]#cat passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin 默認(rèn)結(jié)束標(biāo)記是回車,現(xiàn)在文件內(nèi)容為兩行
以/作為記錄分隔符,顯示行號(hào)和文件內(nèi)容
[root@zeq files]#awk -vRS="/" '{print NR,$0}' passwd.txt NR是顯示行號(hào) $0是顯示一整行的內(nèi)容
1root:x:0:0:root:2root:3bin4bash
bin:x:1:1:bin:5bin:6sbin7 nologin 現(xiàn)在以/為記錄分隔符就變成了7行
這里的awk -vRS="/" -v給變量賦值,RS是awk內(nèi)置變量,設(shè)置/為記錄分隔符
1.2 awk中表示行和列
NR==1
第一行
$1
第一列
$NF
最后一列
$NF-1
倒數(shù)第二列
1.3 awk模式匹配(條件)
模式-pattern? 幫助你找到想要的行
1)正則表達(dá)式
2)比較
>
<
==
3)范圍
4)BEGIN{} END{}
1.4 正則表達(dá)式
~
某一列中包含xxx
!~
某一列中不包含xxx
^
以....開頭的字符(列)
$
以....什么結(jié)尾的
.*
所有
^$
空行
轉(zhuǎn)義字符 backslash? 脫掉馬甲打回原形
[]
匹配[]的每一個(gè)字符
+
一個(gè)字符出現(xiàn)1次或1次以上
|
或者
()
反向引用,一個(gè)整體,保護(hù)里面的內(nèi)容
*
一個(gè)字符出現(xiàn)0次或者0次以上
{}
0{n,m} 數(shù)字0連續(xù)出現(xiàn)了至少n次,最多m次
?
一個(gè)字符出現(xiàn)0次或1次
1.4.1 awk正則表達(dá)式練習(xí)
創(chuàng)建環(huán)境
mkdir -p /server/files/cat>>/server/files/reg.txt<
Zhang Dandan41117397 :250:100:175第一列是姓氏
Zhang Xiaoyu390320151 :155:90:201第二列是名字
Meng Feixue80042789 :250:60:50第一第二列合起來就是姓名
Wu Waiwai70271111 :250:80:75第三列是對(duì)應(yīng)的ID號(hào)碼
Liu Bingbing41117483 :250:100:175最后三列是三次捐款數(shù)量
Wang Xiaoai3515064655 :50:95:135Zi Gege1986787350 :250:168:200Li Youjiu918391635 :175:75:300Lao Nanhai918391635 :250:100:175EOF
1.4.2 取出第3列中以數(shù)字4開頭的行
[root@zeq files]#awk '$3~/^4/' reg.txt $3 第3列 ~ 包括 ^4 以4開頭
Zhang Dandan41117397 :250:100:175Liu Bingbing41117483 :250:100:175
1.4.3 顯示Xiaoyu的姓氏和ID號(hào)碼
[root@zeq files]#awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang390320151
1.4.4 顯示所有以41開頭的ID號(hào)碼的人的全名和ID號(hào)碼
[root@zeq files]#awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan41117397Liu Bingbing41117483
awk默認(rèn)動(dòng)作
[root@zeq files]#awk '$3~/^41/' reg.txt
Zhang Dandan41117397 :250:100:175Liu Bingbing41117483 :250:100:175
[root@zeq files]#awk '$3~/^41/{print }' reg.txt
Zhang Dandan41117397 :250:100:175Liu Bingbing41117483 :250:100:175
1.4.5 顯示所有ID號(hào)碼最后一位數(shù)字是1或5的人的全名
方法1
[root@zeq files]#awk '$3~/[15]$/{print $1,$2}' reg.txt []匹配里面的1和5 $表示以...結(jié)尾
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法2
[root@zeq files]#awk '$3~/(1|5)$/{print $1,$2}' reg.txt |或者 1或者5
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
1.4.6 顯示Xiaoyu的捐款.每個(gè)值時(shí)都有以$開頭.如$520$200$135
[root@zeq files]#awk -F: -vOFS=$ '/Xiaoyu/{print "$"$2,$3,$4}' reg.txt
$155$90$201 -F指定:為分隔符 -vOFS=$輸出$為分隔符
1.5 awk替換
gsub? awk內(nèi)置函數(shù)
1.5.1 格式
gsub(/要替換的內(nèi)容/,"替換成什么",替換的部分)
1.5.2 接“顯示Xiaoyu的捐款.每個(gè)值時(shí)都有以$開頭.如$520$200$135”這一題
[root@zeq files]#awk '{gsub(/:/,"$"); print}' reg.txt 把所有的冒號(hào)替換成$
Zhang Dandan41117397 $250$100$175Zhang Xiaoyu390320151 $155$90$201Meng Feixue80042789 $250$60$50Wu Waiwai70271111 $250$80$75Liu Bingbing41117483 $250$100$175Wang Xiaoai3515064655 $50$95$135Zi Gege1986787350 $250$168$200Li Youjiu918391635 $175$75$300Lao Nanhai918391635 $250$100$175
加上條件精確到哪一部分
[root@zeq files]#awk '$2~/Xiaoyu/{gsub(/:/,"$"); print $NF}' reg.txt $NF最后一列
$155$90$201
1.6 范圍
1、從第1行到第5行內(nèi)容
awk? 'NR==1,NR==5'
2、從包含某個(gè)內(nèi)容的行到包含某個(gè)內(nèi)容的行
awk? '/內(nèi)容/,/內(nèi)容/'
1.6.1 顯示從第1行到第5行內(nèi)容
[root@zeq files]#awk 'NR==1,NR==5' reg.txt
Zhang Dandan41117397 :250:100:175Zhang Xiaoyu390320151 :155:90:201Meng Feixue80042789 :250:60:50Wu Waiwai70271111 :250:80:75Liu Bingbing41117483 :250:100:175
1.6.2 顯示包含Xiaoyu到包含Waiwai的行
[root@zeq files]#awk '/Xiaoyu/,/Waiwai/' reg.txt
Zhang Xiaoyu390320151 :155:90:201Meng Feixue80042789 :250:60:50Wu Waiwai70271111 :250:80:75
1.7 比較表達(dá)式
$5>500第五列大于500
NR>20大于第20行的行,20行以后>
>=
==
!=不等于<=
<
1.7.1 查看磁盤信息 df -h
[root@zeq files]#df -h
Filesystem Size Used Avail Use%Mounted on/dev/sda3 19G 7.8G 10G 44% /tmpfs 491M 0 491M 0% /dev/shm/dev/sda1 190M 61M 120M 34% /boot/dev/sdb1 193M 1.8M 181M 1% /data
1.7.2 顯示出磁盤使用率大于20%的磁盤分區(qū)名稱和掛載點(diǎn)(錯(cuò)誤范例)
[root@zeq files]#df -h|awk '$5>20{print $1,$NF}'
Filesystem on/dev/sda3 /
/dev/sda1 /boot
[root@zeq files]#df -h|awk '$5>9{print $1,$NF}' 這里會(huì)默認(rèn)$5>9是字符串(字母)而不是比較表達(dá)
Filesystem on
1.7.3 解決方法1 ????指定分隔符只保留數(shù)字部分
[root@zeq files]#df -h|awk -F"[% ]+" '$5>9{print $1,$NF}'
Filesystem on/dev/sda3 /
/dev/sda1 /boot
想要去掉第一列Filesystem on信息
[root@zeq files]#df -h|awk 'NR>1 && $5+0>9{print $1,$NF}' 第1行以后(&&并且)
/dev/sda3 /
/dev/sda1 /boot
1.7.4 解決方法2??? 某一列+0
[root@zeq files]#df -h|awk '$5+0>9{print $1,$NF}' 第5列做比較,第5列加0
/dev/sda3 /
/dev/sda1 /boot
1.8 特殊模式 BEGIN{}? END{}
1)awk執(zhí)行的過程
1.執(zhí)行命令的參數(shù)(賦值) -F -v
2.BEGIN{} 里面的內(nèi)容 (awk還沒有開始讀取文件內(nèi)容)
3.讀取文件內(nèi)容
判斷是否滿足條件(模式)
符合 執(zhí)行命令(動(dòng)作)
不符合? 讀取下一行直到最后一行
4.文件內(nèi)容讀取完成后,開始執(zhí)行END{}里面的內(nèi)容
2)BEGIN{}?? 里面的內(nèi)容會(huì)在 awk讀取文件內(nèi)容之前執(zhí)行
1.顯示標(biāo)題
2.修改awk內(nèi)置變量 創(chuàng)建變量
awk 'BEGIN{OFS=:}' ?相當(dāng)于 awk -vOFS=:
3.測試 計(jì)算
3)END{} ??awk讀取完文件之后 執(zhí)行
顯示計(jì)算結(jié)果
先計(jì)算,END顯示結(jié)果
1.8.1 統(tǒng)計(jì)passwd.txt中虛擬用戶的數(shù)量
[root@zeq files]#cat passwd.txt 查看文件虛擬用戶為nologin
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
統(tǒng)計(jì)數(shù)量
[root@zeq files]#awk '/nologin$/{i=i+1}END{print i}' passwd.txt i=i+1相當(dāng)于i++
6
1.8.2 統(tǒng)計(jì)/etc/services 文件中空行的數(shù)量
[root@zeq files]#awk '/^$/{i++}END{print i}' /etc/services
16
1.9 awk動(dòng)作
gsub 函數(shù) (命令)
變量 計(jì)算
1.9.1 計(jì)算磁盤使用率
[root@zeq files]#df
Filesystem 1K-blocks Used Available Use%Mounted on/dev/sda3 19534104 8076500 10458644 44% /tmpfs502056 0 502056 0% /dev/shm/dev/sda1 194241 62009 121992 34% /boot/dev/sdb1 197209 1813 185003 1% /data
[root@zeq files]#df |awk 'NR>1{print $3/$2}'
0.41345600.319237
0.00919329
1.9.2 查看內(nèi)存信息 ??free??? free -h
[root@zeq files]#free
total used free shared buffers cached
Mem:1004112 806016 198096 236 101452 563232
-/+ buffers/cache: 141332 862780Swap:786428 420 786008
1.9.3 計(jì)算系統(tǒng)內(nèi)存的使用率
[root@zeq files]#free |awk '/Mem/{print ($3-$6-$7)/$2}'
0.140705[root@zeq files]#free|awk 'NR==3{print $3/($3+$4)}'
0.140705
1.9.4 計(jì)算系統(tǒng)內(nèi)存的剩余率
[root@zeq files]#free|awk 'NR==3{print $4/($3+$4)}'
0.859211
1.9.5 設(shè)置變量計(jì)算系統(tǒng)內(nèi)存的使用率和剩余率
[root@zeq files]#free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}' sum為變量
0.140765 0.859235
總結(jié)
以上是生活随笔為你收集整理的linux三剑客试题,linux三剑客-awk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼 PS5 手柄 / 主机盖板新金属配
- 下一篇: shell脚本如何实现goto_linu