最轻量准确的方式是直接读取/proc/net/dev并用awk按字段位置提取:第2列rx_packets、第10列tx_packets、第3列rx_bytes、第11列tx_bytes,需跳过标题行且适配空格不固定格式。

直接读取 /proc/net/dev 并用 awk 提取指定接口的收发包数或字节数,是最轻量、最准确的方式——不依赖第三方工具,无采样延迟,数据来自内核实时统计。
提取指定网卡的接收/发送包总数
/proc/net/dev 的第二列是接收包总数(rx_packets),第十列是发送包总数(tx_packets)。注意:首行是标题,字段间空格不固定,必须靠字段位置而非固定分隔符识别。
- 提取
ens33的收发包数:awk '/ens33/ {print "RX:", $2, "TX:", $10}' /proc/net/dev - 只输出数字,方便脚本后续处理:
awk '/ens33/ {print $2, $10}' /proc/net/dev - 若接口名含空格或特殊字符(如
docker0),建议用正则锚定开头:awk '$1 ~ /^docker0:/ {print $2, $10}' /proc/net/dev
提取接收/发送字节数(更常用的实际流量)
第三列是接收字节数(rx_bytes),第十一列是发送字节数(tx_bytes)。这两项常用于计算带宽(bps)或绘图。
- 快速获取
eth0当前字节数:awk '/eth0/ {print "RX_BYTES:", $3, "TX_BYTES:", $11}' /proc/net/dev - 去掉单位和标签,纯数字一行输出:
awk '/eth0/ {print $3, $11}' /proc/net/dev - 配合
printf格式化为 KB/MB(需 shell 层处理):awk '/eth0/ {rx=$3/1024; tx=$11/1024; printf "RX: %.1f KB, TX: %.1f KB\n", rx, tx}' /proc/net/dev
做两次快照计算实时速率
单次读取只能得累计值;要算每秒流量,需间隔 1 秒读两次,相减再除以时间差。
- 简单 shell + awk 实现 1 秒速率估算:
old=($(awk '/eth0/ {print $3, $11}' /proc/net/dev)); sleep 1; new=($(awk '/eth0/ {print $3, $11}' /proc/net/dev)); echo "RX: $((${new[0]}-${old[0]})) B/s, TX: $((${new[1]}-${old[1]})) B/s" - 更健壮的做法:用 awk 自身记录上一次值(需写入临时文件或用
NR==FNR技巧),但对简单监控,shell 变量已够用 - 注意溢出:计数器是无符号 32 位或 64 位整数,若差值为负,说明发生回绕,需按模处理(实际在现代系统中极少发生)
过滤并格式化多接口输出
想一次性看所有物理网卡(排除 lo、veth*、docker0 等虚拟接口),可用 awk 条件过滤 + 整齐排版。
- 列出所有非回环、非虚拟的网卡及其当前 RX/TX 字节数:
awk '$1 !~ /^(lo|virbr|veth|docker|br-)/ && NF>10 {gsub(/:/,"",$1); printf "%-10s %12s %12s\n", $1, $3, $11}' /proc/net/dev - 加单位缩写(KB/MB)并自动换算:
awk '$1 !~ /^lo:/ && NF>10 {gsub(/:/,"",$1); rx=$3; tx=$11; rxf=(rx











