(standard_in)1:parsing错误

我正在编写一个快速的脚本来计算从/ 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) 

当我运行这个时,我得到以下错误(从debugging模式):

 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本身,但是我并不确定如何纠正它。

任何build议是受欢迎的。

谢谢你的时间,

我的/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生成科学的格式。

你不需要这些长管道,你不需要使用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)编写整个脚本。