読者です 読者をやめる 読者になる 読者になる

argius note

プログラミング関連

簡易アクセスログ解析

# 月ごとにファイルが分かれる
YYYY/MM/DD HH:MI:SS : ip-address [path] user-agent

こんな感じのフォーマットで出力されたアクセスログを、FTPで取得して集計するスクリプトを書こうと思い、久しぶりにRubyを使ってみた。packとFTPとuniqがメインかな。同じIPアドレスはカウントしない。自分のアクセスは、カッコ内の数字。

require 'net/ftp'

# パラメータは内緒
# host user password dir prefix home

# ログの解析
log = Hash.new
an = lambda do |line|
  row = line.chomp.unpack "A10xA8x3A15xA*"
  date = row[0].strip
  ip = row[2].strip
  iplist = if log.key?(date) then log[date] else [] end
  iplist << ip
  log[date] = iplist
end

# FTPでログを取得
p = ARGV[0]
ftp = Net::FTP.open host, user, password
ftp.chdir dir
ftp.retrlines "RETR #{prefix}.#{p}.log", &an
ftp.close

# 解析結果を出力
total = 0
log.keys.sort.each do |date|
  iplist = log[date]
  unilist = iplist.uniq
  count = unilist.size
  except = 0
  unilist.each do |ip|
    if ip.index(home) == 0
      except += 1
    end
  end
  puts "#{date} の件数 : %4d (%4d)" % [count, except]
  total += count
end
puts "           総合計 : %4d" % total

実行すると、こんな感じ。

$ ruby an.rb 200610
2006/10/16 の件数 :   XX (   1)
2006/10/17 の件数 :   XX (   0)
2006/10/18 の件数 :   XX (   1)
           総合計 :  XXX
$