将两个awk输出相加为单个输出

将两个awk输出相加为单个输出,awk,Awk,目前,我使用以下行计算我的wifi连接(名为wlp4s0)的当前下载和上载速度: awk '{if(l1){printf ("%.2f", ($2-l1)/1024/1024); print "MB/s"; printf ("%.2f", ($10-l2)/1024/1024); print "MB/s"} else {l1=$2; l2=$10;}}' <(grep wlp4s0 /proc/net/dev)

目前,我使用以下行计算我的wifi连接(名为wlp4s0)的当前下载和上载速度:

awk '{if(l1){printf ("%.2f", ($2-l1)/1024/1024); print "MB/s"; printf ("%.2f", ($10-l2)/1024/1024); print "MB/s"} else {l1=$2; l2=$10;}}' <(grep wlp4s0 /proc/net/dev) <(sleep 1; grep wlp4s0 /proc/net/dev)

awk'{if(l1){printf(%.2f)”($2-l1)/1024/1024);打印“MB/s”;打印“MB/s”($10-l2)/1024/1024);打印“MB/s”}否则{l1=$2;l2=$10;}'类似的东西应该可以工作,但不需要测试

$ awk 'function pr(x) {printf "%.2f %s\n", x/1024/1024,"MB/s"}  
       /wlp4s0/ && !w++ {wf2=$2; wf10=$10}
       /enp3s0/ && !e++ {ef2=$2; ef10=$10}                    
       /wlp4s0/ && w==2 {pr($2-wf2); pr($10-wf10); w=0}
       /enp3s0/ && e==2 {pr($2-ef2); pr($10-ef10); e=0}' <(cat /proc/net/dev) <(sleep 1; cat /proc/net/dev)
$awk'函数pr(x){printf“%.2f%s\n”,x/1024/1024,“MB/s”}
/wlp4s0/&!w++{wf2=$2;wf10=$10}
/enp3s0/&!e++{ef2=$2;ef10=$10}
/wlp4s0/&&w==2{pr($2-wf2);pr($10-wf10);w=0}

/enp3s0/&&e==2{pr($2-ef2);pr($10-ef10);e=0}'这个过程中的睡眠是非常可爱的,我想我以前没有见过

以下是我的做法(未经测试):


最后的输出格式设置留作练习:-)。

考虑到
/proc/net/dev
的大小以及解析速度相对较快,您可以编写一个短脚本来监视所有命名接口,并在VT100兼容终端上创建一个漂亮的动态更新信息块,使用ANSI转义显示每个接口的传输速率

脚本使用超时值
read
来控制样本之间的延迟(按
'q'
退出):


这只是另一种剥猫皮的方法。

你确定你需要grep和awk吗?你可以在一个
awk
调用中完成这一切,保存,例如
($2-l1)/1024/1024)
作为变量
down
并对每个文件求和。然后使用
END
规则输出结果。是的,这对我很有帮助!最后一个问题:我发现wf2存储了一个错误的值。我这样做是为了测试:
w==1{wf2=$2;wf10=$10;}w==2{pr(wf2);pr(wf10);w=0}'尝试更新的版本。因为你没有发布任何输入文件,所以它没有经过测试。你是对的,下次我应该提供一个示例文件,对不起。新版本非常完美,我不知道您可以只写“/wlp4s0/”来访问相关的捕获值,这就是缺少的,谢谢。所以我认为旧版本也应该适用于此。不过我对它做了一点修改,现在我将下载值和上传值相加,这样我只能得到两个输出:最终解决方案:
awk'函数pr(x){printf“%.2f%s\n”,x/1024/1024,“MB/s”}/wlp4s0/&&!w++{wf2=$2;wf10=$10}/enp3s0/&!e++{ef2=$2;ef10=$10}/wlp4s0/&w==2{wdown=$2-wf2;wup=$10-wf10;w++}/enp3s0/&e==2{edown=$2-ef2;eup=$10-ef10;e++}w==3&&e==3{pr(wdown+edown);pr(wup+eup);w=0;e=0}'
$ awk 'function pr(x) {printf "%.2f %s\n", x/1024/1024,"MB/s"}  
       /wlp4s0/ && !w++ {wf2=$2; wf10=$10}
       /enp3s0/ && !e++ {ef2=$2; ef10=$10}                    
       /wlp4s0/ && w==2 {pr($2-wf2); pr($10-wf10); w=0}
       /enp3s0/ && e==2 {pr($2-ef2); pr($10-ef10); e=0}' <(cat /proc/net/dev) <(sleep 1; cat /proc/net/dev)
file='/proc/net/dev'
tmp=$(mktemp) &&
cp -- "$file" "$tmp" &&
sleep 1 &&
awk '
    /wlp4s0/ { vals["wifi","dn",NR==FNR] = $2; vals["wifi","up",NR==FNR] = $10 }
    /enp3s0/ { vals["ethr","dn",NR==FNR] = $2; vals["ethr","up",NR==FNR] = $10 }
    END {
        split("wifi ethr", cons)
        split("dn up", dirs)
        for (i=1; i in cons; i++) {
            con = cons[i]
            for (j=1; j in dirs; j++) {
                dir = dirs[j]
                val = (vals[con,dir,0] - vals[con,dir,1])/1024/1024)
                printf "%s %s %.2f MB/s\n", con, dir, val
                tot[dir] += val
            }
        }
        for (j=1; j in dirs; j++) {
            printf "%s %.2f MB/s\n", dir, tot[dir]
        }
    }
' "$tmp" "$file" &&
rm -f "$tmp"
#!/bin/bash

dev="/proc/net/dev"
ifaces=($(awk '/[a-z0-9]+:/{print $1}' "$dev"))
bytes=($(awk '/[a-z0-9]+:/{print $2}' "$dev"))
nfaces=${#ifaces[@]}
c=0

tput civis
printf "Device   Bytes/sec\n--------------------\n"

while [ "$c" != 'q' ]; do
    read -n 1 -t 1 -r c
    if [ $? -ge 128 ]; then
        current=($(awk '/[a-z0-9]+:/{print $2}' "$dev"))
        for ((i = 0; i < nfaces; i++)); do
            rate=$((${current[i]}-${bytes[i]}))
            printf "%-8s %s\033[K\n" "${ifaces[i]}" "$rate"
        done
        printf "\033[${nfaces}A"
        bytes=(${current[@]})
    fi
done

printf "\033[1D%c\r\033[${nfaces}B" "${ifaces[0]:0:1}"
tput cnorm

exit 0
$ bash readnet.sh
Device   Bytes/sec
--------------------
eth0:    0
lo:      0
wlan0:   624