0

内容が数字であるファイルを1行に1つずつ受け取るUnixシェルスクリプト(できれば汎用sh)を設計しようとしています。これらの数値は、次の方法で取得した mpstat からの CPU アイドル時間です。

cat ${PARSE_FILE} | awk '{print $13}' | grep "^[!0-9]" > temp.txt

したがって、ファイルは次のような数字のリストです。

46.19
93.41
73.60
99.40
95.80
96.00
77.10
99.20
52.76
81.18
69.38
89.80
97.00
97.40
76.18
97.10

これらの値が実際に何であるかは、行 1 がコア 1 用であり、行 2 がコア 2 用であるということです... X 個のコア (私の場合は 8) 用です。

元のファイルは次のようになります。

10/28/2013  Linux 2.6.32-358.el6.x86_64 (host)  10/28/2013  _x86_64_    

(32 CPU)
10/28/2013  
10/28/2013  02:25:05 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10/28/2013  02:25:15 PM    0   51.20    0.00    2.61    0.00    0.00    0.00    0.00    0.00   46.19
10/28/2013  02:25:15 PM    1    6.09    0.00    0.50    0.00    0.00    0.00    0.00    0.00   93.41
10/28/2013  02:25:15 PM    2   25.20    0.00    1.20    0.00    0.00    0.00    0.00    0.00   73.60
10/28/2013  02:25:15 PM    3    0.40    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.40
10/28/2013  02:25:15 PM    4    3.80    0.00    0.40    0.00    0.00    0.00    0.00    0.00   95.80
10/28/2013  02:25:15 PM    5    3.70    0.00    0.30    0.00    0.00    0.00    0.00    0.00   96.00
10/28/2013  02:25:15 PM    6   21.70    0.00    1.20    0.00    0.00    0.00    0.00    0.00   77.10
10/28/2013  02:25:15 PM    7    0.70    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.20
10/28/2013  02:25:25 PM    0   45.03    0.00    1.61    0.00    0.00    0.60    0.00    0.00   52.76
10/28/2013  02:25:25 PM    1   17.82    0.00    1.00    0.00    0.00    0.00    0.00    0.00   81.18
10/28/2013  02:25:25 PM    2   29.62    0.00    1.00    0.00    0.00    0.00    0.00    0.00   69.38
10/28/2013  02:25:25 PM    3    9.70    0.00    0.40    0.00    0.00    0.10    0.00    0.00   89.80
10/28/2013  02:25:25 PM    4    2.40    0.00    0.60    0.00    0.00    0.00    0.00    0.00   97.00
10/28/2013  02:25:25 PM    5    2.00    0.00    0.60    0.00    0.00    0.00    0.00    0.00   97.40
10/28/2013  02:25:25 PM    6   22.92    0.00    0.90    0.00    0.00    0.00    0.00    0.00   76.18
10/28/2013  02:25:25 PM    7    2.40    0.00    0.50    0.00    0.00    0.00    0.00    0.00   97.10

コアの数とこのファイルを変数として取り、各コアの平均を取得するスクリプトを設計しようとしていますが、これを行う方法がわかりません。ここに私が持っているものがあります:

cat ${PARSE_FILE} | awk '{print $13}' | grep "^[!0-9]" > temp.txt
NUMBER_OF_CORES=8
NUMBER_OF_LINES=`awk ' END { print NR } ' temp.txt`
NUMBER_OF_VALUES=`echo "scale=0;${NUMBER_OF_LINES}/${NUMBER_OF_CORES}" | bc`
for i in `seq 1 ${NUMBER_OF_CORES}`
do
  awk 'NR % $i == 0' temp.txt
  echo Core: ${i} Average: xx
done

したがって、各コアが持つ値の数 (コアを超える行) があるため、スキップする必要がある n 行ごとですが、これをきれいに行う方法がわかりません。基本的に、ファイルを「NUMBER_OF_CORES」回ごとにループし、「NUMBER_OF_CORES」行ごとにスキップして合計し、「NUMBER_OF_VALUES」で割る必要があります。

4

4 に答える 4

1

以下の countCores.sh のスクリプトは、temp.txt で指定したデータに基づいています。ご希望の全体的な合計平均がどのようなものかわからなかったので、8 つのコアすべての値の平均を列 1 に表示することにしました。また、コア番号を表すために cat -n を使用しました。お役に立てれば。ボンベル

#!/bin/bash
#Execute As: countCores.sh temp.txt 8
AllCoreTotals=0
DataFile="$1"
NumCores="$2"
AllCoreTotals=0
NumLines="`cat -n $DataFile|cut -f1|tail -1|tr -d " "`"
PrtCols="`echo $NumLines / $NumCores|bc`"
clear;echo;echo
echo "============================================================="
pr -t${PrtCols} $DataFile|tr -d "\t"|tr -s " "  "+"|bc |\
while read CoreTotal
    do
       CoreAverage=`echo $CoreTotal / $PrtCols|bc`
       echo "$CoreTotal     Core Average $CoreAverage"
       AllCoreTotals="`echo $CoreTotal + $AllCoreTotals|bc`"
       echo "$AllCoreTotals"  > AllCoreTot.tmp
    done|cat -n
AllCoreAverage=`cat AllCoreTot.tmp`
AllCoreAverage="`echo $AllCoreAverage / $NumCores|bc`"
echo "============================================================="
echo "(Col One) Total Core Average: $AllCoreAverage "
rm $DataFile
rm AllCoreTot.tmp
于 2013-10-29T03:31:39.810 に答える
1

これでいいの?

awk '/CPU/&&/idle/{f=1;next}f{a[$4]+=$13;b[$4]++}END{for(i in a){print i,a[i]/b[i]}}' your_file

実際、ここではコア数は必要ありません。ファイルで使用可能なすべてのコアの平均アイドル時間を計算します

テスト済み:

> cat temp
10/28/2013  Linux 2.6.32-358.el6.x86_64 (host)  10/28/2013  _x86_64_    

(32 CPU)
10/28/2013  
10/28/2013  02:25:05 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10/28/2013  02:25:15 PM    0   51.20    0.00    2.61    0.00    0.00    0.00    0.00    0.00   46.19
10/28/2013  02:25:15 PM    1    6.09    0.00    0.50    0.00    0.00    0.00    0.00    0.00   93.41
10/28/2013  02:25:15 PM    2   25.20    0.00    1.20    0.00    0.00    0.00    0.00    0.00   73.60
10/28/2013  02:25:15 PM    3    0.40    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.40
10/28/2013  02:25:15 PM    4    3.80    0.00    0.40    0.00    0.00    0.00    0.00    0.00   95.80
10/28/2013  02:25:15 PM    5    3.70    0.00    0.30    0.00    0.00    0.00    0.00    0.00   96.00
10/28/2013  02:25:15 PM    6   21.70    0.00    1.20    0.00    0.00    0.00    0.00    0.00   77.10
10/28/2013  02:25:15 PM    7    0.70    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.20
10/28/2013  02:25:25 PM    0   45.03    0.00    1.61    0.00    0.00    0.60    0.00    0.00   52.76
10/28/2013  02:25:25 PM    1   17.82    0.00    1.00    0.00    0.00    0.00    0.00    0.00   81.18
10/28/2013  02:25:25 PM    2   29.62    0.00    1.00    0.00    0.00    0.00    0.00    0.00   69.38
10/28/2013  02:25:25 PM    3    9.70    0.00    0.40    0.00    0.00    0.10    0.00    0.00   89.80
10/28/2013  02:25:25 PM    4    2.40    0.00    0.60    0.00    0.00    0.00    0.00    0.00   97.00
10/28/2013  02:25:25 PM    5    2.00    0.00    0.60    0.00    0.00    0.00    0.00    0.00   97.40
10/28/2013  02:25:25 PM    6   22.92    0.00    0.90    0.00    0.00    0.00    0.00    0.00   76.18
10/28/2013  02:25:25 PM    7    2.40    0.00    0.50    0.00    0.00    0.00    0.00    0.00   97.10
> nawk '/CPU/&&/idle/{f=1;next}f{a[$4]+=$13;b[$4]++}END{for(i in a){print i,a[i]/b[i]}}' temp
2 71.49
3 94.6
4 96.4
5 96.7
6 76.64
7 98.15
0 49.475
1 87.295
> 
于 2013-10-29T13:35:32.113 に答える