無需安裝 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 秒讀取兩次,相減得速率 (bytes/s),再換算為 kb/s 或 Mb/s。
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)
}
}'
getline 讀取管線/檔案,必須搭配 close() 否則二次讀取失敗system("sleep 1") 非阻塞睡眠,返回值 >=0 表示成功system("clear") 清屏實現動畫效果OFMT="%.3f" 控制輸出浮點格式net[介面名] 儲存上一輪總位元組數lo : 12.345 kb/s
eth0 : 1567.890 kb/s
docker0 : 0.000 kb/s
strftime("%H:%M:%S") 顯示時間戳awk -v iface=eth0 ...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 流程控制,即可隨需構建監控利器。