分页: 1 / 1
怎样实现输出保留两位小数?
发表于 : 2012-05-02 13:41
由 YeLee
代码: 全选
#! /bin/bash
nic=$1
netdev=/proc/net/dev
if [ $# != 1 ] ; then
echo "Usage : $0 NIC"
exit 1
fi
if [ -z "$(grep $nic: $netdev)" ];then
echo "Invalid NIC"
exit 1
fi
in_orig=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $1 }')
out_orig=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $9 }')
while true
do
sleep 1
in=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $1 }')
out=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $9 }')
in_diff=$(echo $in $in_orig|awk '{printf "%5.2f", ($1-$2)/1024}')
out_diff=$(echo $out $out_orig|awk '{printf "%5.2f", ($1-$2)/1024}')
in_total=$(echo $in|awk '{printf "%6.2f", $1/1024/1024}')
out_total=$(echo $out|awk '{printf "%6.2f", $1/1024/1024}')
echo "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
in_orig=${in}
out_orig=${out}
done
修改了一下,应该差不多了。
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 15:14
由 eexpress
bash当lisp写啊。这么多重()。
那些变量,只要运算,都是整数了吧。
估计只能在echo里面,写bc。echo "312.4/40"|bc -l。当然awk可以。
换perl最好。
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 15:18
由 jtshs256
自带的当然没小数,我都直接*100 再加 . 的
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 15:44
由 麦斯特
伟大的神啊,这种小菜鸟写出的东西乃就不要喷了吧。
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 16:35
由 lilydjwg
bash 不支持浮点数么?
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 20:00
由 YeLee
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 20:04
由 jtshs256
lss 用的 zsh?……
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 20:30
由 枫叶饭团
jtshs256 写了:lss 用的 zsh?……
听说的是
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 20:36
由 lilydjwg
枫叶饭团 写了:jtshs256 写了:lss 用的 zsh?……
听说的是
嗯,支持浮点数的。我记得曾经看到哪个软件在某个版本增加了浮点数的支持,还以为是 bash 呢,现在想起是 Vim。
Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-02 23:07
由 YeLee
代码: 全选
diff -u nicmonitor.orig nicmonitor
--- nicmonitor.orig 2012-05-02 19:49:26.253538669 +0800
+++ nicmonitor 2012-05-02 21:45:00.306720215 +0800
@@ -16,10 +16,10 @@
sleep 1
in=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $1 }')
out=$(grep $nic $netdev|sed "s/$nic://"|awk '{ print $9 }')
- in_diff=$(echo $in $in_orig|awk '{printf "%5.2f", ($1-$2)/1024}')
- out_diff=$(echo $out $out_orig|awk '{printf "%5.2f", ($1-$2)/1024}')
- in_total=$(echo $in|awk '{printf "%6.2f", $1/1024/1024}')
- out_total=$(echo $out|awk '{printf "%6.2f", $1/1024/1024}')
+ in_diff=$(awk 'BEGIN{printf "%5.2f", '"$[in-in_orig]"'/1024}')
+ out_diff=$(awk 'BEGIN{printf "%5.2f", '"$[out-out_orig]"'/1024}')
+ in_total=$(awk 'BEGIN{printf "%6.2f", '"$in"'/1024/1024}')
+ out_total=$(awk 'BEGIN{printf "%6.2f", '"$out"'/1024/1024}')
echo "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
in_orig=${in}
out_orig=${out}
无视脚本大婶,再修改一下。

Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-03 16:37
由 ChenFengyuan
eexpress 写了:bash当lisp写啊。这么多重()。
那些变量,只要运算,都是整数了吧。
估计只能在echo里面,写bc。echo "312.4/40"|bc -l。当然awk可以。
换perl最好。
哪里多了,好像一行才一对()

Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-04 13:33
由 YeLee
代码: 全选
diff -u nicmonitor.orig nicmonitor
--- nicmonitor.orig 2012-05-02 21:45:00.306720215 +0800
+++ nicmonitor 2012-05-04 13:24:34.221711182 +0800
@@ -20,7 +20,11 @@
out_diff=$(awk 'BEGIN{printf "%5.2f", '"$[out-out_orig]"'/1024}')
in_total=$(awk 'BEGIN{printf "%6.2f", '"$in"'/1024/1024}')
out_total=$(awk 'BEGIN{printf "%6.2f", '"$out"'/1024/1024}')
- echo "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
+# echo "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
+ tput sc
+# echo -n "$nic:IN ";tput setf 4;echo -n ${in_diff}K;tput sgr0;echo -n " OUT ";tput setf 4;echo -n ${out_diff}K;tput sgr0;echo -n " TOTALIN ";tput setf 4;echo -n ${in_total}M;tput sgr0;echo -n " TOTALOUT ";tput setf 4;echo -n ${out_total}M;tput sgr0
+ echo -n "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
+ tput rc
in_orig=${in}
out_orig=${out}
done
本来想加点很邪恶的东西进去的,但发现出了点问题,还是有空再折腾吧。

Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-04 16:43
由 YeLee
代码: 全选
无高亮刷屏
echo "$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M"
高亮刷屏
echo -e "$nic:IN \e[1;31m${in_diff}K\e[0m OUT \e[1;31m${out_diff}K\e[0m TOTALIN \e[1;31m${in_total}M\e[0m TOTALOUT \e[1;31m${out_total}M\e[0m"
无高亮单行输出
echo -ne "\e[s$nic:IN ${in_diff}K OUT ${out_diff}K TOTALIN ${in_total}M TOTALOUT ${out_total}M\e[u"
高亮单行输出
echo -ne "\e[s$nic:IN \e[1;31m${in_diff}K\e[0m OUT \e[1;31m${out_diff}K\e[0m TOTALIN \e[1;31m${in_total}M\e[0m TOTALOUT \e[1;31m${out_total}M\e[0m\e[u"
今天下午查了点资料,总算弄清楚这个问题了。

Re: 怎样实现输出保留两位小数?
发表于 : 2012-05-09 22:30
由 liu滔
YeLee真厉害

Re: 怎样实现输出保留两位小数?
发表于 : 2012-07-16 21:51
由 YeLee
晕,发现加了控制代码之后,数值出现了很大的偏差……假如太精确的话,那效率确实不敢恭维。
