利用 awk 強大的關聯陣列與管線處理,單行指令即可從 netstat -an 提取對端 IP 並統計連線數,效能遠超 Shell 迴圈寫法。
awk 'BEGIN{
while ("netstat -an" | getline) {
if ($5 ~ /^[0-9]/) {
split($5, a, ":")
ip[a[1]]++
}
}
for (k in ip) print k, ip[k] | "sort -rn -k2"
}'
netstat -an:顯示所有網路連線 (數字格式 IP/Port)$5:第 5 欄位為「對端 IP:Port」$5 ~ /^[0-9]/:過濾掉監聽狀態行 (如 *:80)split($5, a, ":"):以冒號分割 IP 與 Port,a[1] 為 IPip[a[1]]++:關聯陣列以 IP 為鍵計數print ... | "sort -rn -k2":管線導向 sort,依第 2 欄位數值反序排序211.151.33.14 28
113.65.21.200 14
121.32.89.106 13
60.191.178.230 12
118.133.177.104 12
58.61.152.154 11
...
awk '$6=="ESTABLISHED"{split($5,a,":"); ip[a[1]]++} END{for(k in ip) print k,ip[k]}' <(netstat -an) | sort -rn -k2
awk 'BEGIN{while("netstat -an"|getline){if($5~/^[0-9]/){split($5,a,":");ip[a[1]]++}} for(k in ip)print k,ip[k]}' | sort -rn -k2 | head -20
watch -n 5 'awk '"'"'BEGIN{while("netstat -an"|getline){if($5~/^[0-9]/){split($5,a,":");ip[a[1]]++}} for(k in ip)print k,ip[k]}'"'"' | sort -rn -k2 | head -20'
| 方案 | 複雜度 | 啟動開銷 | 記憶體 |
|---|---|---|---|
| Shell 迴圈 + grep + wc | O(n²) | 高 (多進程) | 高 |
| awk 關聯陣列 | O(n) | 低 (單進程) | 低 |
awk 內建關聯陣列以雜湊表實現,插入/查找均為 O(1),單進程處理完畢再管線給 sort,是百萬級連線分析的首選。
awk 'BEGIN{
while("netstat -an"|getline){
if($5~/^[0-9]/){
split($5,a,":")
port[a[2]]++
}
}
for(p in port) print p, port[p] | "sort -rn -k2"
}'
輸出熱門端口分布,快速發現異常流量或掃描行為。