awk技巧總結

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來處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章