获取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下都有一致的表现。
有两个注意的点:
echo命令会自动在打印内容后面加上
\n换行,除非使用-n参数指定不加printf不会自动加换行符,意味着你必须每次都要手动在最后面加上
\n,在zsh中,如果一个打印后面没有换行符,它在显示的时候会自动加上一个%以警告用户缺少换行符。并且zsh会自动换行。如下图所示:
你可以将整个屏幕理解为一个一个字符格子,在内存中就是一个二维矩阵。默认情况下每个格子都是一个空白字符。每次打印一个字符时,就会在当前光标所在的格子填充这个字符,然后光标向后移动一格。如果遇到 \n 这样的符号,光标就会移动到下一行的格子上;同样,\b 表示向前移动一格,\r 表示将光标移动到当前行首。
甚至可以使用文本样式设置字符,例如 echo -e "\x1B[5m警告:系统检测到异常活动!\x1B[0m" 会一直闪烁输出警告文本;echo -e "请访问我们的网站:\x1B[4mhttps://example.com\x1B[0m" 会在网址下面添加下划线。也能控制文字输出颜色等等。


