Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

awk 一行指令統計 IP 連線數:netstat 配合關聯陣列實現高效分析

編輯:Linux 教學

利用 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"
}'

逐段解析

  1. netstat -an:顯示所有網路連線 (數字格式 IP/Port)
  2. $5:第 5 欄位為「對端 IP:Port」
  3. $5 ~ /^[0-9]/:過濾掉監聽狀態行 (如 *:80)
  4. split($5, a, ":"):以冒號分割 IP 與 Port,a[1] 為 IP
  5. ip[a[1]]++:關聯陣列以 IP 為鍵計數
  6. print ... | "sort -rn -k2":管線導向 sort,依第 2 欄位數值反序排序

實測輸出 (耗時 1.149s)

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
...

進階變體

僅統計 ESTABLISHED 連線

awk '$6=="ESTABLISHED"{split($5,a,":"); ip[a[1]]++} END{for(k in ip) print k,ip[k]}' <(netstat -an) | sort -rn -k2

顯示前 20 大來源 IP

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

持續監控模式 (每 5 秒刷新)

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 + wcO(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"
}'

輸出熱門端口分布,快速發現異常流量或掃描行為。

Copyright © Windows教程網 All Rights Reserved