- 締切済み
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 という風に同じホストごとに配列に格納するという処理をどう書けばいいのかが分かりません。 分かる方いましたら回答お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
ハッシュの初期値の与え方を間違えていました。 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 これでいけます。
- sakusaker7
- ベストアンサー率62% (800/1280)
ホスト名ごとの振り分けは #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)
がると申します。 んと…基本的には ・連想配列に、配列のインスタンスを持たせる で出来ると思うのですが、どうでしょうか?
お礼
回答ありがとうございます。 Hashを使って作ってみようと思います。
お礼
回答ありがとうございます。 参考にして作ってみようと思います。