第1章 awk指哪打哪 1.1 awk內置變數 FS 輸入欄位(列)分隔符 -F : 相當於-vFS : NR number of record 行號(記錄號) NF number of filed 每行有多少列 OFS output 輸出分隔符 RS record separator 記錄分隔符每 ...
第1章 awk指哪打哪
1.1 awk內置變數
FS |
輸入欄位(列)分隔符 |
-F : |
相當於-vFS : |
NR |
number of record 行號(記錄號) |
NF |
number of filed 每行有多少列 |
OFS |
output 輸出分隔符 |
RS |
record separator 記錄分隔符每一的結束標記 預設是回車 |
IGNORECASE |
是否忽略大小寫 1為忽略 |
1.1.1 RS 記錄分隔符 每一的結束標記預設是回車
[root@zeq files]# cat passwd.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 預設結束標記是回車,現在文件內容為兩行
以/作為記錄分隔符,顯示行號和文件內容
[root@zeq files]# awk -vRS="/" '{print NR,$0}' passwd.txt NR是顯示行號 $0是顯示一整行的內容 1 root:x:0:0:root: 2 root: 3 bin 4 bash bin:x:1:1:bin: 5 bin: 6 sbin 7 nologin 現在以/為記錄分隔符就變成了7行 這裡的awk -vRS="/" -v給變數賦值,RS是awk內置變數,設置/為記錄分隔符
1.2 awk中表示行和列
NR==1 |
第一行 |
$1 |
第一列 |
$NF |
最後一列 |
$NF-1 |
倒數第二列 |
1.3 awk模式匹配(條件)
模式-pattern 幫助你找到想要的行
1)正則表達式
2)比較
>
<
==
3)範圍
4)BEGIN{} END{}
1.4 正則表達式
~ |
某一列中包含xxx |
!~ |
某一列中不包含xxx |
^ |
以....開頭的字元(列) |
$ |
以....什麼結尾的 |
.* |
所有 |
^$ |
空行 |
\ |
轉義字元 backslash 脫掉馬甲打回原形 |
[] |
匹配[]的每一個字元 |
+ |
一個字元出現1次或1次以上 |
| |
或者 |
() |
反向引用,一個整體,保護裡面的內容 |
* |
一個字元出現0次或者0次以上 |
{} |
0{n,m} 數字0連續出現了至少n次,最多m次 |
? |
一個字元出現0次或1次 |
1.4.1 awk正則表達式練習
創建環境
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 第三列是對應的ID號碼 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
1.4.2 取出第3列中以數字4開頭的行
[root@zeq files]# awk '$3~/^4/' reg.txt $3 第3列 ~ 包括 ^4 以4開頭 Zhang Dandan 41117397 :250:100:175 Liu Bingbing 41117483 :250:100:175
1.4.3 顯示Xiaoyu的姓氏和ID號碼
[root@zeq files]# awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt Zhang 390320151
1.4.4 顯示所有以41開頭的ID號碼的人的全名和ID號碼
[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt Zhang Dandan 41117397 Liu Bingbing 41117483
awk預設動作
[root@zeq files]# awk '$3~/^41/' reg.txt Zhang Dandan 41117397 :250:100:175 Liu Bingbing 41117483 :250:100:175
[root@zeq files]# awk '$3~/^41/{print }' reg.txt Zhang Dandan 41117397 :250:100:175 Liu Bingbing 41117483 :250:100:175
1.4.5 顯示所有ID號碼最後一位數字是1或5的人的全名
方法1 [root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt []匹配裡面的1和5 $表示以...結尾 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的捐款.每個值時都有以$開頭.如$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內置函數
1.5.1 格式
gsub(/要替換的內容/,"替換成什麼",替換的部分)
1.5.2 接“顯示Xiaoyu的捐款.每個值時都有以$開頭.如$520$200$135”這一題
[root@zeq files]# awk '{gsub(/:/,"$"); 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@zeq files]# awk '$2~/Xiaoyu/{gsub(/:/,"$"); print $NF}' reg.txt $NF最後一列 $155$90$201
1.6 範圍
1、從第1行到第5行內容
awk 'NR==1,NR==5'
2、從包含某個內容的行到包含某個內容的行
awk '/內容/,/內容/'
1.6.1 顯示從第1行到第5行內容
[root@zeq files]# awk 'NR==1,NR==5' 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
1.6.2 顯示包含Xiaoyu到包含Waiwai的行
[root@zeq files]# awk '/Xiaoyu/,/Waiwai/' reg.txt Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75
1.7 比較表達式
$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%的磁碟分區名稱和掛載點(錯誤範例)
[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}' 這裡會預設$5>9是字元串(字母)而不是比較表達 Filesystem on
1.7.3 解決方法1 指定分隔符只保留數字部分
[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執行的過程
1.執行命令的參數(賦值) -F -v
2.BEGIN{} 裡面的內容 (awk還沒有開始讀取文件內容)
3.讀取文件內容
判斷是否滿足條件(模式)
符合 執行命令(動作)
不符合 讀取下一行直到最後一行
4.文件內容讀取完成後,開始執行END{}裡面的內容
2)BEGIN{} 裡面的內容會在 awk讀取文件內容之前執行
1.顯示標題
2.修改awk內置變數 創建變數
awk 'BEGIN{OFS=:}' 相當於 awk -vOFS=:
3.測試 計算
3)END{} awk讀取完文件之後 執行
顯示計算結果
先計算,END顯示結果
1.8.1 統計passwd.txt中虛擬用戶的數量
[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
統計數量
[root@zeq files]# awk '/nologin$/{i=i+1}END{print i}' passwd.txt i=i+1相當於i++ 6
1.8.2 統計/etc/services 文件中空行的數量
[root@zeq files]# awk '/^$/{i++}END{print i}' /etc/services 16
1.9 awk動作
gsub 函數 (命令)
變數 計算
1.9.1 計算磁碟使用率
[root@zeq files]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 19534104 8076500 10458644 44% / tmpfs 502056 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.413456 0 0.319237 0.00919329
1.9.2 查看記憶體信息 free free -h
[root@zeq files]# free total used free shared buffers cached Mem: 1004112 806016 198096 236 101452 563232 -/+ buffers/cache: 141332 862780 Swap: 786428 420 786008
1.9.3 計算系統記憶體的使用率
[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 計算系統記憶體的剩餘率
[root@zeq files]# free|awk 'NR==3{print $4/($3+$4)}' 0.859211
1.9.5 設置變數計算系統記憶體的使用率和剩餘率
[root@zeq files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}' sum為變數 0.140765 0.859235