oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

スクリプトメモ

書いたスクリプトのメモ。Linux上でvmstatを出力したログファイルの
CPUアイドル値だけの平均を計算して、CPU使用率として出力。
カレントディレクトリ内のvmstatログファイルを全て計算し結果をログとして出力。
exerb
http://exerb.sourceforge.jp/man/doc/tutorial.ja.html#0101
を使えばWindows上でも気軽に使えるので、こういうこまごま作業は楽。
でも、rubyっぽく書けていないなー。早くrubyっぽく書けるようになりたい。
未だにクラスとか良くわかっていないし。

-----------------------------------------------------------ここから
#!/usr/local/bin/ruby
STDOUT.sync = true

#ディレクトリの中身を格納する
@log = []
#処理をしたログファイル名を格納するインスタンス変数
@file_name = []
#平均値を格納するインスタンス変数
@cpu_avg = []


#保存されているディレクトリを検索します
def get_dir
	#@log = gets.chomp
	@log = Dir.glob("*.*")
end

#ファイルの中身をチェックして、vmstatの結果が出力されているログファイルのみ名前を取得する
def get_proc_file
	@log.each do |log|
		file = open(log)
		text = file.gets
		if text =~  /procs*/
			@file_name << log
		else
		end
		file.close
	end
end

#取得したログファイルを順に平均値を計算し取得していく
def cpu_avg
	@file_name.each do |name|
		last = []
		file = open(name)
		while text = file.gets do
			first = text.gsub(/  */, ",")
			secound = first.sub(/,/, "")
			third = secound.split(/\s*,\s*/)
			if third[14] =~ /[0-9][0-9]*/
				last << Integer(third[14])
			else
			end
		end
		a = (last.length - 1)
		b = ((last.inject(0){|result, i| result + i }) - last[0])
		test = (b.to_f / a.to_f)
		test = ((100 - test) * 100 ).round / 100.0
		@cpu_avg << test
		file.close
	end
end

#結果を標準出力にするのかCSV形式にするのか判定
def print_pat
	pat = 0
	puts "出力形式を選択してください。"
	puts "1:標準形式  2:CSV形式(番号で選択してください)"
	while pat !~ /[1..2]/
		pat = gets.chomp
		if pat == "1"
			print_normal_log()
		elsif pat == "2"
			print_csv_log()
		else
			puts "入力した番号が間違っています。再度入力してください"
			pat = gets.chomp
		end
	end
end

#結果を標準出力でcpu_avg.logに書き込む
def print_normal_log
	fh = open("cpu_avg.log","w")
	i = 0
	puts "ただ今出力中・・・"
	for i in 0..(@file_name.length.to_i - 1)
		fh.print @file_name[i]
		fh.print "\n"
		fh.print @cpu_avg[i]
		fh.print "%"
		fh.print "\n\n"
		i += 1
	end
	puts "出力が完了しました"
	fh.close
end

#結果をCSV形式でcpu_avg.logに書き込む
def print_csv_log
	fh = open("cpu_avg.log","w")
	i = 0
	puts "ただ今出力中・・・"
	fh.print "ファイル名,平均値\n"
	for i in 0..(@file_name.length.to_i - 1)
		fh.print @file_name[i]
		fh.print ","
		fh.print @cpu_avg[i]
		fh.print "%"
		fh.print "\n"
		i += 1
	end
	puts "出力が完了しました"
	fh.close
end

#実行
get_dir()
get_proc_file()
cpu_avg()
print_pat()

------------------------------------------------ここまで

追記:
予想以上に汚く見える・・・。