将两个awk输出相加为单个输出
目前,我使用以下行计算我的wifi连接(名为wlp4s0)的当前下载和上载速度:将两个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)
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