• 締切済み

Apacheログの解析

rubyを使って aaabbb - - [20/Jun/2001:19:16:15 +0900] "GET / HTTP/1.0" 200 4636 bbbccc - - [20/Jun/2001:19:16:15 +0900] "GET /pbpenguin.png HTTP/1.0" 304 - http://sss.org/ aaaaaa - - [20/Jun/2001:19:16:15 +0900] "GET /pbdebian.png HTTP/1.0" 304 - http://aaa.org/ruby/ ssssss - - [20/Jun/2001:19:16:27 +0900] "GET /ruby/ HTTP/1.0" 200 4371 aaabbb - - [20/Jun/2001:19:16:30 +0900] "GET /ruby/rice.html HTTP/1.0" 200 2388 このようなapacheのログから、ホストごとのrefererを時系列順に表示するプログラムを作りたいのですが、 aaabbb -> 配列1 bbbccc -> 配列2 aaaaaa -> 配列3 ssssss -> 配列4 aaabbb -> 配列1 という風に同じホストごとに配列に格納するという処理をどう書けばいいのかが分かりません。 分かる方いましたら回答お願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

ハッシュの初期値の与え方を間違えていました。 master = Hash.new {|h, k| h[k] = Array.new} DATA.each do |line| host, rest = line.chomp.split(/ /, 2) #puts host #puts rest master[host] << rest end これでいけます。

seifonsan
質問者

お礼

回答ありがとうございます。 参考にして作ってみようと思います。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ホスト名ごとの振り分けは #master = Hash.new {Array.new} master = Hash.new DATA.each do |line| host, rest = line.chomp.split(/ /, 2) #puts host #puts rest #master[host] << rest if master[host].nil? master[host] = [rest] else master[host] <<rest end end master['aaabbb'].each {|e| puts e} __END__ aaabbb - - [20/Jun/2001:19:16:15 +0900] "GET / HTTP/1.0" 200 4636 bbbccc - - [20/Jun/2001:19:16:15 +0900] "GET /pbpenguin.png HTTP/1.0" 304 - http://sss.org/ aaaaaa - - [20/Jun/2001:19:16:15 +0900] "GET /pbdebian.png HTTP/1.0" 304 - http://aaa.org/ruby/ ssssss - - [20/Jun/2001:19:16:27 +0900] "GET /ruby/ HTTP/1.0" 200 4371 aaabbb - - [20/Jun/2001:19:16:30 +0900] "GET /ruby/rice.html HTTP/1.0" 200 2388 実行結果: - - [20/Jun/2001:19:16:15 +0900] "GET / HTTP/1.0" 200 4636 - - [20/Jun/2001:19:16:30 +0900] "GET /ruby/rice.html HTTP/1.0" 200 2388 のように書けますので、あとはこの配列を時刻をキーにソートしてやればいいでしょう。 #しかし if で振り分けなくても行けるはずなんだがなあ

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んと…基本的には ・連想配列に、配列のインスタンスを持たせる で出来ると思うのですが、どうでしょうか?

seifonsan
質問者

お礼

回答ありがとうございます。 Hashを使って作ってみようと思います。

関連するQ&A