前回の続きですが、ログを収集し、分布(80%台が~%、70%台が~%)を出したいとします。
ロジック
ロジックは以下のような流れになりました。
- ログからメモリ使用率を数字として取込
- 配列として格納
- 各使用率ごとに計算
- 最後に%の出力
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#ここで使用率を整数2桁にし、空白区切りの文字列にする MEMORY_RESOURCE=` cat $ログファイル名 | grep $対象の日付 | sed -e "s/.*\([0-9]\{2\}\)\..*/\1/g" ` #配列に格納 MEMORY_RESOURCE_ARR=( ` echo $MEMORY_RESOURCE ` ) #要素数の算出 MEMORY_RESOURCE_ARR_COUNT=${#MEMORY_RESOURCE_ARR[@]} MEMORY_PERCENT_50=0 MEMORY_PERCENT_60=0 MEMORY_PERCENT_70=0 MEMORY_PERCENT_80=0 #配列をループで回して各使用率ごとにカウントアップさせる for item in ${MEMORY_RESOURCE_ARR[@]}; do if [ $item -gt 80 ] then ((MEMORY_PERCENT_80++)) elif [ $item -gt 70 ] then ((MEMORY_PERCENT_70++)) elif [ $item -gt 60 ] then ((MEMORY_PERCENT_60++)) elif [ $item -gt 50 ] then ((MEMORY_PERCENT_50++)) fi done #最後に全体数と割って%を出す echo $((MEMORY_PERCENT_80 * 100/MEMORY_RESOURCE_ARR_COUNT)) echo $((MEMORY_PERCENT_70 * 100/MEMORY_RESOURCE_ARR_COUNT)) echo $((MEMORY_PERCENT_60 * 100/MEMORY_RESOURCE_ARR_COUNT)) echo $((MEMORY_PERCENT_50 * 100/MEMORY_RESOURCE_ARR_COUNT)) |
気づいたこと
- 算術式を使うときは(())でくくり、$はいらない。結果を文字列として出力するときは$を付ける
- 通常の算術式だと小数点まででない。使いたいときはbcを使うか最初にawkで計算をする
参考リンク
シェルで変数のインクリメントに expr を使うと100倍遅い件
逆引きシェルスクリプト/スペース区切りの文字列を配列に格納する方法
多分もっと効率のいい方法はあるんだろうけど、とりあえず最初はこれで妥協。