1,指定多分隔符
實例: 提取文件名和大小,展示爲"test.sql.gz 100M"
# du -sh /bkup/dayback/test.sql.gz
100M /bkup/dayback/test.sql.gz
命令如下:
# du -sh /bkup/dayback/test.sql.gz | awk -F '[/ ]+' '{print $NF, " ", $1}'
test.sql.gz 100M
命令解析:
- -F 指定分隔符
- -F[/ ]+ 表示指定多個分隔符,這裏指定/和空格(也可以是其他),+爲正則表達式,表示+前面的字符(/或者空格)重複1次或者一次以上
- $NF awk內置變量,表示最後一個字段的內容
- NF awk內置變量,表示瀏覽記錄字段的個數
更多:
# echo "1:::2:3 4 5 6" | awk -F[: ]+ '{print $4}'
4
2,數組
實例:統計tcp連接狀態
# netstat -an |grep ^tcp | head -5
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 192.168.200.41:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
# netstat -an | awk '/^tcp/{++S[$NF]} END{for(a in S) print a, S[a]}'
LAST_ACK 54
LISTEN 24
CLOSE_WAIT 70
ESTABLISHED 86
FIN_WAIT2 32
TIME_WAIT 984
命令解析:
awk中的數組本質上屬於關聯數組,也就說它的下標可以爲字符串,在上述例子中,首先創建了一個數組S並且將該命令輸出的最後一個字段作爲下標(LAST_ACK,LISTEN,CLOSE_WAIT...),當執行到第一行時,我們引用的是S['LISTEN'],很明顯這個元素是不存在的,awk在元素不存在時,會自動創建該元素,並且將該元素的值設爲0,因此經過計算後S['LISTEN']值會變爲1,由於END模式中的語句會在最後執行,這裏姑且先不考慮它,繼續運行第二行,依舊是S['LISTEN'],此時經過計算,它的值會變爲2,以此類推,指導執行完最後一行結束,進入END模式的運行,通過一個for循環,打印出數組的下標和它的值,即爲我們最終想要的結果。PS:awk在字符串,空字符串參與運算時,也會將其當做0來處理