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

Shell + awk 實時監控網卡流量腳本:零依賴、秒級刷新、生產可用

編輯:Linux 教學

無需安裝 iftop、nload 等第三方工具,僅用 /proc/net/dev 與 awk 即可實現秒級網卡流量監控,適合極簡環境或嵌入式裝置。

核心原理

/proc/net/dev 記錄各網卡累計收發位元組數:

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 1068205690 ...
  eth0: 91581844 334143895 ...
  • 第 1 欄位:介面名 (含冒號)
  • 第 2 欄位:接收位元組 (RX bytes)
  • 第 10 欄位:傳送位元組 (TX bytes)

間隔 1 秒讀取兩次,相減得速率 (bytes/s),再換算為 kb/s 或 Mb/s。

完整 awk 腳本

awk '
BEGIN {
    OFMT="%.3f"
    devf="/proc/net/dev"
    # 初始化基準值
    while (("cat " devf) | getline) {
        if ($0 ~ /:/ && ($10+0) > 0) {
            split($1, tarr, ":")
            net[tarr[1]] = $2 + $10   # RX + TX 總位元組
        }
    }
    close(devf)
    # 每秒輪詢
    while (system("sleep 1") >= 0) {
        system("clear")
        while (getline < devf) {
            if ($0 ~ /:/ && ($10+0) > 0) {
                split($1, tarr, ":")
                if (tarr[1] in net) {
                    # 計算速率:(當前總量 - 基準) * 8 / 1024 → kb/s
                    rate = ($2 + $10 - net[tarr[1]]) * 8 / 1024
                    printf "%-10s : %.3f kb/s\n", tarr[1], rate
                    net[tarr[1]] = $2 + $10  # 更新基準
                }
            }
        }
        close(devf)
    }
}'

關鍵技術點解析

  1. getline 讀取管線/檔案,必須搭配 close() 否則二次讀取失敗
  2. system("sleep 1") 非阻塞睡眠,返回值 >=0 表示成功
  3. system("clear") 清屏實現動畫效果
  4. OFMT="%.3f" 控制輸出浮點格式
  5. 陣列 net[介面名] 儲存上一輪總位元組數

執行效果示意

lo         : 12.345 kb/s
eth0       : 1567.890 kb/s
docker0    : 0.000 kb/s

進階擴充建議

  • 加入 strftime("%H:%M:%S") 顯示時間戳
  • 支援參數指定介面:awk -v iface=eth0 ...
  • 輸出 CSV/JSON 供 Grafana/Prometheus 採集
  • 整合 tput 控制光標,避免全屏閃爍

同原理擴充:連線數監控

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

輸出:

211.151.33.14 28
113.65.21.200 14
...

這類零依賴腳本在容器、極簡 Linux、救援模式極具價值,掌握 /proc 檔案系統與 awk 流程控制,即可隨需構建監控利器。

Copyright © Windows教程網 All Rights Reserved