Ruby
Mein erstes kleines Ruby-Programm: logsep
Da hosteurope blöderweise für all meine Domains ein gemeinsames Logfile verwendet und dieses wöchentlich statt monatlich abspeichert, brauchte ich zur Vernünftigen Analyse ein Programm, das aus allen Logfiles die Zeilen einliest und diese anschließend in seperate Dateien entsprechend den Hostnamen abspeichert.
Da hier einige Zeilen unschön über den Spaltenrand gucken, hab ich das ganze hinter diesem netten Link versteckt:
#!d:\programme\ruby\bin\ruby.exe
he = /"(www\.)?([^":]*)(:\d{1,6})?"$/
output = Hash.new
ARGV.each do |filename|
File.open(filename) do |f|
f.each do |line|
host = he.match(line)[2]
if not output[host].kind_of?(File)
output[host] = File.new(host+'.log', 'w')
end
output[host].print line
end
end
end
output.each_value do |file|
file.close
end
Dieses zweite Programm log2sql macht aus Logfiles SQL-Statements zum Eintrag in eine Tabelle, die ich dann mit SQL untersuchen kann. Eigentlich war dies das erste, ist aber wegen der langen Zeilen nicht so schön anzusehen. Die [^\])\”-Konstrukte sind extrem hässlich, leider unterstützt Ruby noch keine Lookbehind-Assertions in Regulären Ausdrücken.
#!d:\programme\ruby\bin\ruby.exe
rm = /([.\d]*) (.*?) (.*?) \[([^\s]*) \+\d{4}\] \"(.*?[^\\])\" (-|\d*) (-|\d*) \"(.*?[^\\])\" \"(.*?[^\\])\" \"(.*?[^\\])\"/
month = { 'Jan' => '01', 'Feb' => '02',
'Mar' => '03', 'Apr' => '04',
'May' => '05', 'Jun' => '06',
'Jul' => '07', 'Aug' => '08',
'Sep' => '09', 'Oct' => '10',
'Nov' => '11', 'Dec' => '12'
}
ARGV.each do |filename|
f=File.open(filename)
f.each do |line|
erg = rm.match(line)
sqldate = erg[4][7,4] + '-' + month[erg[4][3,3]] + '-' + erg[4][0,2] + ' ' + erg[4][12,8]
puts 'insert into log values("' + erg[1..3].join('","') +'","'+sqldate+'","'+ erg[5..10].join('","') + '");'
end
f.close
end
Die dazugehörige Tabelle:
CREATE TABLE `log` (
`rhost` varchar(20),
`rlog` varchar(255),
`user` varchar(200),
`time` datetime,
`req` text,
`status` int(11),
`bytes` int(11),
`referer` varchar(255),
`agent` varchar(255),
`host` varchar(255),
KEY `time` (`time`)
)


6 Kommentare zu 'Ruby'
clipping!
Was ist Ruby?
ne objektorientierte Skriptsprache, mehr hier: http://www.ruby-lang.org/en/
Na wonach sieht’s denn aus?
objektorientierte Skriptsprache? Bäh!
Wieso bäh?