获取linux实时网速

linux中的/proc是一个虚拟目录,里面都是系统在运行过程中的各种状态,例如内存使用情况,网络情况,各个进程的运行情况等等。它是一个虚拟目录,只有在系统运行起来后才有而且仅存在于内存中。有点类似于MySQL的视图。

查看当前内存的使用情况:

查看网络的使用情况:

由此可知,如果想要计算当前的网络流速,则只需要在间隔1秒前后分别得到bytes列的数据,然后相减即可。以下为一个shell脚本:

#!/bin/bash

while true
do
init_state=$(cat /proc/net/dev | grep wlp2s0)
sleep 1
end_state=$(cat /proc/net/dev | grep wlp2s0)

rx1=$(echo $init_state | awk '{print $2}')
rx2=$(echo $end_state | awk '{print $2}')
rx_speed=$(((rx2 - rx1) / 1024))

tx1=$(echo $init_state | awk '{print $10}')
tx2=$(echo $end_state | awk '{print $10}')
tx_speed=$(((tx2 - tx1) / 1024))

#printf "RX: $rx_speed kbps, tx: $tx_speed kbps\r"
# 打印很长的空行是为了覆盖掉前面一次的打印结果。否则如果前一次打印出很长的东西,下一次又没那么长,则下一次打印的后面会有上一次打印更长的部分
# \r控制光标返回行首,echo命令会自动在文本后面加上\n换行,-n命令就是让它不加换行符,-e命令就是让它把\r之类的特殊符号作为控制符处理
echo -ne " \r"
echo -ne "RX: $rx_speed kbps, tx: $tx_speed kbps\r"
done

然后使用 chmod +x test.sh 再执行 ./test.sh 即可

注:不要使用 sh test.sh 执行,因为sh不支持 echo -ne 参数,会把这个参数也当作打印内容。

更好的方式应该是使用printf指令进行打印,它在大多数shell下都有一致的表现。

有两个注意的点:

  1. echo命令会自动在打印内容后面加上\n换行,除非使用-n参数指定不加
  2. printf不会自动加换行符,意味着你必须每次都要手动在最后面加上\n,在zsh中,如果一个打印后面没有换行符,它在显示的时候会自动加上一个%以警告用户缺少换行符。并且zsh会自动换行。如下图所示:

你可以将整个屏幕理解为一个一个字符格子,在内存中就是一个二维矩阵。默认情况下每个格子都是一个空白字符。每次打印一个字符时,就会在当前光标所在的格子填充这个字符,然后光标向后移动一格,如果遇到\n这样的符号,光标就会移动到下一行的格子上,同样,\b表示向前移动一格,\r表示将光标移动到当前行首。甚至可以使用文本样式设置字符,例如 echo -e "\x1B[5m警告:系统检测到异常活动!\x1B[0m"会一直闪烁输出 警告:系统检测到异常活动!echo -e "请访问我们的网站:\x1B[4mhttps://example.com\x1B[0m"会在网址下面添加下划线。也能控制文字输出颜色等等。

Leave a Comment