3

/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 自体にさかのぼることができましたが、実際にそれを修正する方法がわかりません。

どんなアドバイスでも大歓迎です。

御時間ありがとうございます、

4

2 に答える 2

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)}')

次のように最初の 2 行を組み合わせることができます。

read -r int1_byte_rx int1_byte_tx <<< $(awk -v int="$int1" '$0 ~ int {sumrx += $2; sumtx+= $10} END {print sumrx, sumtx}' "$logfile")

ログファイルを一度だけ読む必要があります。

もう 1 つの方法は、スクリプト全体を AWK、または Python や Perl などの浮動小数点演算をサポートする別の言語で記述することです。

于 2012-06-08T01:55:34.160 に答える
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、そもそも科学的形式を生成しないようにすることです。

于 2012-06-08T01:39:25.423 に答える