awk是Linux中三劍客之一,awk在對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,可以根據按行按列的操作金屬數據分析。相比於sed,優勢在於取行取列最快,並且應用數組有計算的功能。sed是換數據最快最好用的。
一、 AWK的基礎用法
1 awk基本使用格式:
awk [參數] ‘模式[動作]’ 文件名
其中:
參數:-F “ ” 指定分列符,默認是以空格作為分列符的
模式:內容的查找范圍→過濾的文件內容(按行取數)
NR 記錄符,取行,不是真正的行數,是awk處理過的行數(如NR==2)
/ / 取內容(如/^b/)
動作:{}里面可以有多個動作,語句間用;分隔
awk –F “[ :]+” ‘NR==2{print $13,14}’取多列用,分隔
$ 表示取列的意思
$NR 表示取最后一列
$0 表示取出所有列
2 awk執行過程
BEGIN
1)awk讀入第一行內容
2)判斷是否符合模式中的條件
a,如果匹配則執行對應的動作
b,如果不匹配條件,繼續讀取下一行
3)繼續讀取下一行
4)重復過程1-3,直到讀取到最后一行
END
注:BEGIN和END只執行一次,中間部分有幾行執行幾次
3 awk完整使用格式:
(1)BEGIN模塊:在awk讀取文件之前執行一次,一般用來定義內置變量,也可以輸出表頭
(2)END 模塊:在awk讀取玩所有的文件的時候,在執行END模塊,一般用來輸出一個結果(累加、數組結果),也可以是和BEGIN模塊類似的結尾標識符
(3)關於行:
RS:(record separator)讀入換行符,行與行之間怎么分隔,默認是\n
ORS:(output record separator)輸出換行符,默認也是\n
注:awk中可以通過BEGIN模塊來重新定義修改變量值,如BEGIN{RS=“/”}
awk對每一行的記錄號都有一個內置變量NR來保存,沒處理一次,NR自動加一
(4)關於列:
FS:(field separator)輸入(列)分隔符。默認空格做分隔符
命令:
①-F參數:-F “:”
②BEGIN模塊:‘BEGIN{FS=“:”}
注:默認awk中是以空格作為分隔符的,但是默認的分列符是將內容前后空格都去掉以后,再算空格的,不同於指定空格作為分隔符。
二、awk模式與動作
1 模式(過濾條件)分為:
①正則表達式作為模式(符號、字符)
②比較表達式作為模式(大小)
③范圍模式
④特殊模式BEGIN和END
(1)正則表達式作為模式:(/^r/ 以…開頭)
awk支持所有正則,默認不支持{},加參數—posix
正則表達式的運用,默認是在行內查找匹配到的字符串,若有匹
配則執行動作;但有時候需要固定的列來匹配指定的內容(加~)
~正則匹配操作符,用於對記錄或區域的表達式進行匹配
awk正則中 |
^或$是匹配一個字符串的開頭或結尾 |
sed和grep |
^或$是匹配行的開頭或結尾 |
(2)比較表達式作為模塊:(比較大小,相等)
awk –F ‘$5==”root”’ test
(3)范圍模式
(4)BEGIN模式和END模式
BEGIN模塊:
② 變量賦值:BEGIN{a=1;b=2;print a,b,a+b}
③ 修改內置變量:BEGIN{FS=”[ :]+”}
④ 輸出表頭:BEGIN{print “username”,”UID”}
⑤ 計算:BEGIN{print 10/3}
END模塊:
最后awk讀完所有文件時,再執行END模塊,一般用來輸出一個結果(累加,數組結果),也可以是和BEGIN模塊類似的結尾標識。
應用:
▲企業應用:
?按單詞出現頻率降序排序(計算文件中每個單詞的重復數量)
需掌握的關於統計的幾個命令
uniq 去重 (參數-C 去重的同時計數)
sort 排序,默認是按26個字母排序,第一列
-n 按數字進行排序
-r 逆轉排序
-k 指定按哪一列排序
以上,可以完成排序,去重任務,但是不能計算,故下面引入數組。
AWK數組:
for (i in h) print i,h[i]
其中,
i 是變量,i里存的書房間號,特點:不會重復
in 變量從哪里取值
h 數組名
應用:awk最重要的一個功能是計數,而數組是在awk里最大的作用是去重
(1)去重並計數(統計重復數)
(2) 去重並計算
數組的房間號的一個特點:不會重復。故經常將要去重的項當成房間號。