我正在编写一个快速脚本,用于根据从/ proc / net / dev中提取的数据计算单个接口吞吐量,我遇到了问题。它将它从字节转换为兆位。
这是在我的ubuntu服务器(3.2.0内核)上工作,但是当我尝试在旧设备(2.6.18时代)上运行它时,它无效。我不确定我做错了什么。
以下是我的代码片段:
int1_byte_rx=`cat $logfile | grep $int1 | awk '{print $2}' | awk '{sum+=$1} END {print sum}'`
int1_byte_tx=`cat $logfile | grep $int1 | awk '{print $10}' | awk '{sum+=$1} END {print sum}'`
int1_rx_thrpt=$(echo "($int1_byte_rx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l)
int1_tx_thrpt=$(echo "($int1_byte_tx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l)
当我运行此操作时,我收到以下错误(来自调试模式):
int1_rx_thrpt=$(echo "($int1_byte_rx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l)
echo "($int1_byte_rx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l
++ echo '(1.13417e+10 * 0.00000762939453) / 57 / (5 * 60)'
++ bc -l
(standard_in) 1: parse error
(standard_in) 1: parse error
+ int1_rx_thrpt=
int1_tx_thrpt=$(echo "($int1_byte_tx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l)
echo "($int1_byte_tx * 0.00000762939453) / $iterations / ($time * 60)" | bc -l
++ echo '(9.78048e+09 * 0.00000762939453) / 57 / (5 * 60)'
++ bc -l
(standard_in) 1: parse error
(standard_in) 1: parse error
我已经能够将问题追溯到bc本身,但我真的不确定如何纠正它。
欢迎任何建议。
感谢您的时间,
答案 0 :(得分:4)
您不需要这些长管道,也不需要使用bc
。
int1_byte_rx=$(awk -v int="$int1" '$0 ~ int {sum += $2} END {print sum}' "$logfile")
int1_byte_tx=$(awk -v int="$int1" '$0 ~ int {sum += $10} END {print sum}' "$logfile")
int1_rx_thrpt=$(awk -v int1_byte_rx="$int1_byte_rx" -v iter="$iterations" -v time="$time" 'BEGIN {printf "%12.2f", (int1_byte_rx * 0.00000762939453) / iter / (time * 60)}')
int1_tx_thrpt=$(awk -v int1_byte_tx="$int1_byte_tx" -v iter="$iterations" -v time="$time" 'BEGIN {printf "%12.2f", (int1_byte_tx * 0.00000762939453) / iter / (time * 60)}')
你可以像这样组合前两行:
read -r int1_byte_rx int1_byte_tx <<< $(awk -v int="$int1" '$0 ~ int {sumrx += $2; sumtx+= $10} END {print sumrx, sumtx}' "$logfile")
你只需要阅读一次日志文件。
另一种方法是用AWK或其他支持浮点运算的语言编写整个脚本,如Python或Perl。
答案 1 :(得分:2)
我的/proc/net/dev
没有足够大的值来强制awk
以科学计数法打印任何输出,所以我不能轻松地测试这个,但这是我的建议修复:
int1_byte_rx=`cat $logfile | grep $int1 | awk '{print $2}' | awk '{sum+=$1} END {printf "%f", sum}'`
int1_byte_tx=`cat $logfile | grep $int1 | awk '{print $10}' | awk '{sum+=$1} END {printf "%f", sum}'`
(注意结尾附近的printf "%f",
部分。)
诀窍是防止awk
首先生成科学格式。