使用awk从不同时间读取的两个文件中的一行中收集网络使用情况

使用awk从不同时间读取的两个文件中的一行中收集网络使用情况,awk,xfce,Awk,Xfce,简单地说,我正在尝试构建一个genmon脚本,它使用awk以1-liner的形式监控网络传输,以减少CPU的使用 我的目标是希望这个脚本每0.25秒更新一次 我目前拥有的是一个4行脚本: PTXRX=( $(awk 'FNR==1' "/sys/class/net/${1}/statistics/tx_bytes" "/sys/class/net/${1}/statistics/rx_bytes") ) sleep 0.125 CTXRX=( $(awk 'FNR==1' "/sys/class

简单地说,我正在尝试构建一个genmon脚本,它使用awk以1-liner的形式监控网络传输,以减少CPU的使用

我的目标是希望这个脚本每0.25秒更新一次

我目前拥有的是一个4行脚本:

PTXRX=( $(awk 'FNR==1' "/sys/class/net/${1}/statistics/tx_bytes" "/sys/class/net/${1}/statistics/rx_bytes") )
sleep 0.125
CTXRX=( $(awk 'FNR==1' "/sys/class/net/${1}/statistics/tx_bytes" "/sys/class/net/${1}/statistics/rx_bytes") )
awk -v ptx=${PTXRX[0]} -v prx=${PTXRX[1]} -v ctx=${CTXRX[0]} -v crx=${CTXRX[1]} 'BEGIN {printf "tx: %.2f KiB/s\nrx: %.2f KiB/s", (ctx-ptx)/512, (crx-prx)/512 }'
0.125
因为插件需要时间来显示更新,所以我们将大约用一半的时间来显示更新,并将值加倍(这并不遥远)

示例数据:(文件中需要的数据)

问题是它占用了我10-20%的CPU…
如何将其简化为单个awk命令并提高性能

对于那些需要直观了解其作用的人,结果应显示:

tx: 0.00 KiB/s
rx: 0.00 KiB/s
试试这个:

IFS= read -r ptx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net/${1}/statistics/rx_bytes"
sleep 0.125
IFS= read -r ctx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r crx < "/sys/class/net/${1}/statistics/rx_bytes"
awk -v ptx="$ptx" -v prx="$prx" -v ctx="$ctx" -v crx="$crx" 'BEGIN {printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512 }'
但这仍然不会产生重大影响

您可以尝试的最后一件事可能会让它的性能稍微好一点(或者甚至更糟,但您可以尝试):

IFS=read-rptx<“/sys/class/net/${1}/statistics/tx_字节”
IFS=read-rprx<“/sys/class/net/${1}/statistics/rx_字节”
睡眠0.125
awk-v ptx=“$ptx”-v prx=“$prx”-v tx_字节=“/sys/class/net/${1}/statistics/tx_字节”-v rx_字节=“/sys/class/net/${1}/statistics/rx_字节”开始{
getline ctx
@EdMorton虽然微不足道,几乎包含在每个linux发行版中,但我还是提供了额外的信息,是的,我的意思是
/
,而不是“不知道是什么让我把事情搞得这么糟,谢谢,错别字更正了。我只是在阅读你的评论之前更正了其中的一个错别字,我说的是tx_字节和rx_字节,它们不难查找,并且在任何linux发行版上都应该包含相同的信息(也就是说,如果该发行版中存在该核心功能的话)。这就是为什么我严格为方便起见提供了0到0xFFFFFFFFFFFFFFFF之间的任何数字,除非允许更大的数字(我至少有一个64位的系统)在一行上提供,作为至少在系统正常运行期间传输的字节数(我真的希望这不是自OS安装以来传输的总字节数)。我无法提供预期为动态的内容的值,因此我只能做一个描述,并期望人们使用自己的系统进行测试(或者只是猜测64位无符号范围内的任何值)。提供了完整的数据示例(从实际文件中获取的结果)我测试了您的系统和oguz的系统(现已删除)分别回答,他的回答使用了我大约7-11%的CPU,而你的回答使用了大约3-8%的CPU。很好的工作看起来仍然有很多CPU被用光了,但我很高兴你对此感到满意。可能有一些事情:执行的命令数,bash数据处理
$(())
xfce4 genmon插件
,但我相信这大概和这个土豆CPU上的一样好(奔腾4+HT,尽情大笑)
IFS= read -r ptx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net/${1}/statistics/rx_bytes"
sleep 0.125
IFS= read -r ctx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r crx < "/sys/class/net/${1}/statistics/rx_bytes"
awk -v ptx="$ptx" -v prx="$prx" -v ctx="$ctx" -v crx="$crx" 'BEGIN {printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512 }'
printf 'tx: %.2f KiB/s\nrx: %.2f KiB/s\n' $(( (ctx-ptx)/512 )) $(( (crx-prx)/512 ))
IFS= read -r ptx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net/${1}/statistics/rx_bytes"
sleep 0.125
awk -v ptx="$ptx" -v prx="$prx" -v tx_bytes="/sys/class/net/${1}/statistics/tx_bytes" -v rx_bytes="/sys/class/net/${1}/statistics/rx_bytes" 'BEGIN{
    getline ctx < tx_bytes
    getline crx < rx_bytes
    printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512
}'