SA - Shell Script(2)

作業二的部分是要寫一個script,真對參數變化然後使用gunplot去進行繪圖

程式要求要有下列參數

  • o : output file name
  • t : type
  • c : collor
  • n : number of point should used

每個參數都要做錯誤檢查,這邊我使用了 getopts 來做參數的取得,並且把對應的值都存起來

然後再一個一個判斷是否有錯誤。

再gnuplot的部分,因為要求X軸必須是反向的,即(-10,-9,-8….0),這部分我採用的是利用一個暫存檔來做

先使用tail的方式取得最後 n筆資料,然後再透過 awk 把項目加上負號並且印出
tail -r -n $pointNumber ${inputFile:="/tmp/sysmonitor"} | awk '{ print -NR" "$1}' > $tempInput
後來有同學說可以再gnuplot中可以使用using這個方式來辦到這個結果。

gnuplot的部分,先把所有設定檔寫入暫存檔中,然後再直接透過gnuplot去執行該檔案,最後再刪除這些暫存檔。

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/sh

print_usage()
{
echo "Usage cpuplot [-h] [-o out_file_name] [-t type] [-c color] -n <60-600>"
}


print_help()
{
echo "-o set the output file name. (default: out.png)"
echo "-t set the graph type. (one of ‘filledcurve’, ‘lines’. default: ‘filledcurve’)"
echo "set graph color. (in hexadecimal form, default: #1E90FF)"
echo "set the number of point should use. (must be set. should be in range[60-600]"
echo "Read LOGFILE environment variable. If it is not set, use /tmp/sysmonitor"
}





# Parse the arguments
while getopts "ho:t:c:n:" opt
do
case "$opt" in
h) print_help;
exit 1
;;
o)
outName=$OPTARG
;;
t)
graphType=$OPTARG
;;
c)
graphColor=$OPTARG
;;
n)
pointNumber=$OPTARG
;;
*)
exit 1
;;
esac

done

# check graph type, which must be filledcurve or lines.
if [ "$graphType" ] ; then
if [ "$graphType" != "filledcurve" ] && [ "$graphType" != "lines" ] ; then
echo "type should be one of 'filledcurve' and 'lines'."
fi
if [ "$graphType" == "filledcurve" ] ; then
graphType="filledcurve y1=0"
fi
fi


# check graph color, wich must fit #[0-9a-f]{6}
if [ "$graphColor" ] ; then
tmp=`echo $graphColor | grep '^#[0-9a-f]\{6\}' `
if [ -z "$tmp" ] ; then
echo "color format error."
exit
fi
fi

# check point number range in 60 ~ 600
if [ -z $pointNumber ] || [ "$pointNumber" -lt 60 ] || [ "$pointNumber" -gt 600 ] ; then
print_usage
exit
fi


# check input files's location

inputFile=`printenv LOGFILE`

#generate a reverse data
tempInput="input2"
`tail -r -n $pointNumber ${inputFile:="/tmp/sysmonitor"} | awk '{ print -NR" "$1}' > $tempInput`


#generate a temp plt file
tempFile="temp.plt"
`touch $tempFile`

echo "set term png" >> $tempFile
echo "set out '${outName:="out.png"}'" >> $tempFile
echo "set title 'CPU Usage'" >> $tempFile
echo "unset key" >> $tempFile
echo "set grid front" >> $tempFile
echo "set xlabel 'time from now(sec)'" >> $tempFile
echo "set ylabel 'CPU Usage(%)'" >> $tempFile
echo "plot [-$pointNumber:0] [0:100] '$tempInput' with ${graphType:="filledcurve y1=0"} linetype rgb '${graphColor:="#1E90FF"}' " >> $tempFile


`gnuplot $tempFile`

if [ -f $tempInput ] ; then
`rm $tempInput`
fi

if [ -f $tempFile ] ; then
`rm $tempFile`
fi