linux之awk
目錄
1.輸出設(shè)置
2.指定分隔符
3.匹配代碼塊
之前的文章介紹了字符,字符串處理 的“函數(shù)”,如grep,sed egrep等,現(xiàn)在介紹一個好用的數(shù)據(jù)處理工具,就是awk,awk 通常將一行分成若干個字段進(jìn)行處理,這里有別于grep 和sed處理按行進(jìn)行處理。
?之所以叫 AWK 是因為其取了三位創(chuàng)始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。簡單來說awk就是把文件逐行讀入,(**空格**,**制表符**)為默認(rèn)分隔符將每行切片,切開的部分再進(jìn)行各種分析處理
awk命令格式如下:
?
1.輸出設(shè)置
awk 可以處理后續(xù)的文件,也可以處理前一個命令的standardoutput,主要處理每一行字段內(nèi)的數(shù)據(jù),默認(rèn)的字段分割符號是空格將或者tab鍵
對比發(fā)現(xiàn),使用awk指定顯示了第1列和第3列,指定賬號和IP之間以tab鍵隔開,也發(fā)現(xiàn)了一個規(guī)律:$1表示第1列,$3表示第3列,是的,每一行的每個字段都是有變量名稱的,那就是$1,$2,$3等等,而 $0 則表示一整行的數(shù)據(jù),第一行就是$0 ,即是root 192.168.1.109,所以awk的處理流程為:
?a.? 讀入第1行,并將第1行的數(shù)據(jù)填入到變量$0,$1,$2,$3...中
?b.? 根據(jù)條件類型的限制,判斷是否進(jìn)行后續(xù)的動作
?c.? 做完所有的工作和條件類型
?d.? 若還有后續(xù)的“行”的數(shù)據(jù),則重復(fù)執(zhí)行步驟a-c,直到處理完所有數(shù)據(jù)
awk 以行為一次操作的單元,而以字段為最小處理的單位,默認(rèn)字段的分割符號是空格或者tab鍵
疑惑:awk 如何得知數(shù)據(jù)有多少行多少列呢,此時 awk 的內(nèi)置變量就發(fā)揮作用了
NF? ?每一行 $0 擁有字段總數(shù)
NR? ?目前awk所處理的是第幾行的數(shù)據(jù)
FS? ? 目前的分割符號是什么,默認(rèn)的是空格
顯示出查找數(shù)據(jù)所在的行數(shù)和列數(shù)
[root @localhost tmp]#last -n 5 | awk '{print $1 "\t lines:" NR "\t columes: " NF }'此外 awk 中還有一些常見的運算符
> ,>=? ? ? ?大于,大于等于
< ,<=? ? ? ?小于,小于等于
==? ? ? ? ? ? 等于
!=? ? ? ? ? ? ?不等于
/etc/passwd中以 : 為分割符號,其中第一個字段是賬號,第三個字段是UID,想要查找第三列小于10以下的數(shù)據(jù),并且列出第一列和第三列
[root @localhost ~]# cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3 } '發(fā)現(xiàn)第一行顯示的不正確,因為在處理第一行的時候,$1,$2默認(rèn)的還是以空格為分隔符的,因此雖然加了FS=:,還是從第二行開始生效的,怎么辦?
利用關(guān)鍵字 BEGIN?
[root @localhost ~]#cat /etc/passwd | awk 'BEGIN { FS=":"} $3 < 10 {print $1 "\t" $3 }'此外,awk 還可以有計算功能,,有如下的數(shù)據(jù),如果計算每個人的Total總和呢?
[root @localhost ~]#cat pay.txt |awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total=$2+$3+$4 printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'?這里對比下cat命令和awk命令輸出
awk '{print}' /proc/meminfo2.指定分隔符
這里再詳細(xì)介紹下所謂指定分隔符的用法
[root@iv-yblfbjnlokl8j1o22bl7 ~]# awk ?'{print}' ?/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
輸出如上所示.指定分割符后輸出
3.匹配代碼塊
awk '/MemFree/{print}' /proc/meminfo MemFree: 142320 kB awk '/MemFree/{printf "%d\n", $2}' /proc/meminfo 142272//純字符匹配 ? !//純字符不匹配 ? ~//字段值匹配 ? ?!~//字段值不匹配 ? ~/a1|a2/字段值匹配a1或a2
測試系統(tǒng)資源的時候,常用的一個使用awk的命令
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.95;}' < /proc/meminfo)k --vm-keep -m 1使用系統(tǒng)壓測工具stress,壓測系統(tǒng)內(nèi)存95%被占用的情況
參考:
https://www.cnblogs.com/sunshine-long/p/9295913.html
https://blog.csdn.net/guoer9973/article/details/44650729
總結(jié)
- 上一篇: linux之source
- 下一篇: linux之文本比较工具