首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(standard_in) 1:解析错误

(standard_in) 1:解析错误
EN

Stack Overflow用户
提问于 2012-06-08 09:25:15
回答 2查看 7.4K关注 0票数 3

我正在编写一个快速脚本,用于从/proc/net/dev中提取数据来计算各个接口的吞吐量,但我遇到了一个问题。它将其从字节转换为兆位。

这在我的ubuntu服务器(3.2.0内核)上是有效的,但是当我尝试在旧设备(2.6.18版本)上运行它时,它不能工作。我不确定我做错了什么。

下面是我的代码片段:

代码语言:javascript
复制
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)

当我运行这个命令时,我得到了以下错误(在调试模式下):

代码语言:javascript
复制
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本身的问题,但我实际上不确定如何纠正它。

欢迎任何建议。

耽误您时间,实在对不起,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-08 09:39:25

我的/proc/net/dev没有足够大的值来强制awk以科学记数法打印任何输出,所以我不能很容易地测试这一点,但我建议的解决方法如下:

代码语言:javascript
复制
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生成科学格式。

票数 2
EN

Stack Overflow用户

发布于 2012-06-08 09:55:34

您不需要那些长管道,也不需要使用bc

代码语言:javascript
复制
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)}')

您可以像这样组合前两行:

代码语言:javascript
复制
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 )编写整个脚本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10941991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档