本博文為老男孩linu教育訓練機構早期的教育訓練教案,特分享以供大家學習參考。
全部系列分為五篇文章,本博文為第二篇:
三、庖丁解牛擷取連接配接狀态數的指令
3.1 擷取連接配接狀态數的awk指令
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
提示:将netstat -n的結果通過管道符交給awk指令處理。
3.2先來執行下netstat -n
[oldboy@LVS-1-1 ~]$ netstat -n|more #截取部分有代表性的内容如下
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local AddressForeign AddressState
tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV
tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV
tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV
tcp00 124.123.3.77:80221.237.233.41:2338TIME_WAIT
tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1
tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT
tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1
tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT
tcp01 124.123.3.77:8059.49.174.176:26913CLOSING
tcp00 124.123.3.77:80120.87.129.35:1787TIME_WAIT
tcp0174 124.123.3.77:80120.71.134.66:1165CLOSING
提示:實際執行這條指令的時候,可能會得到上萬條類似的記錄,我們隻取若幹來舉例。
3.3拆解awk指令
1)完整指令如下
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
2)awk庖丁解牛
指令拆分 | 功能說明 |
/^tcp/ | 過濾出以tcp開頭的行,“^”為正規表達式用法,以...開頭,這裡是過濾出以tcp開頭的行。 |
S[] | 定義了一個名叫S的數組,在awk中,數組下标通常從 1 開始,而不是 0。 |
NF | 目前記錄裡域個數,預設以空格分隔,如上所示的記錄,NF域個數等于6 |
$NF | 表示一行的最後一個域的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是SYN_RECV或TIME_WAIT等。 |
S[$NF] | 表示數組元素的值,如上所示的記錄,就是S[TIME_WAIT]狀态的連接配接數 |
++S[$NF] | 表示把某個數加一,如上所示的記錄,就是把S[TIME_WAIT]狀态的連接配接數加一 |
END | |
for(key in S) | 周遊S[]數組 |
print key,”\t”,S[key] | 列印數組的鍵和值,中間用\t制表符分割,顯示好一些。 |
3)舉個小例子練手
已知test.txt内容:
001 name wodi12k
002 name yingsui 15k
003 name jeacen10k
004 name kuqi8k
005 name yideng10k
006 name xiaofan8k
要求:統計老男孩教育訓練學生中,不同薪水的學生的數量報表。
[oldboy@test ~]$ cat test.txt |awk '/^00/ {++S[$NF]} END {for (a in S) print a,S[a]}'
15k 1
8k 2
10k 2
12k 1
提示:模拟前面的awk指令,過濾以00開頭的行,然後進行處理。
上述awk數組元素内容:
key=12k S[12K]=1
key=15k S[15K]=1
key=10k S[10K]=2
key=8kS[8K]=2
[oldboy@test ~]$ awk '/^00/ {++S[$NF]} END {for (a in S) print a,S[a]}' test.txt
15k 1
8k 2
10k 2
12k 1
提示:awk可以直接處理文本,是以,不需要去cat,不但不專業,而且内容多時,影響處理效率。
本文未完待續。更多博文内容: