* 簡易アクセス集計スクリプト(携帯) [#o00f3515]
携帯端末からのアクセスを集計する。
** 使い方 [#j6e8133a]
シェルから
シェルからApacgeのアクセスログファイルを引数にして実行。結果はファイルにリダイレクトするなどして保存する。
./this-script.pl /var/www/logs/access_log.200908* > 2009-08.csv
** スクリプト [#g41a38b1]
#!/usr/local/bin/perl
use strict;
use warnings;
use DateTime::Format::HTTP;
use Data::Dumper;
my %agent = (
'SB' => [ 'J-PHONE', 'Vodafone', 'SoftBank', 'MOT-C', 'MOT-V' ],
'DOCOMO' => [ 'DoCoMo' ],
'AU' => [ 'KDDI-', 'UP\.Browser', ],
);
my @files = @ARGV;
my %data;
foreach my $file (@files) {
open my $fh, '<', $file or die "$!: $file";
while ( my $line = <$fh> ) {
chomp $line;
my ( $host, $ident, $user, $time, $request, $status, $bytes, $referer, $agent ) =
( $line =~ /^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "(.*?)" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/ );
my $dt = DateTime::Format::HTTP->parse_datetime( $time, 'Asia/Tokyo' );
next unless $request =~ m#^(GET|POST) /index.html#;
unless ( exists $data{ $dt->ymd } ) {
$data{ $dt->ymd }->{$_} = 0 for qw/SB DOCOMO AU ALL/;
}
my $hit;
if ( grep { $agent =~ /^$_/ } @{ $agent{SB} } ) {
$data{ $dt->ymd }->{SB} = $data{ $dt->ymd }->{SB} + 1;
$hit = 1;
}
elsif ( grep { $agent =~ /^$_/ } @{ $agent{DOCOMO} } ) {
$data{ $dt->ymd }->{DOCOMO} = $data{ $dt->ymd }->{DOCOMO} + 1;
$hit = 1;
}
elsif ( grep { $agent =~ /^$_/ } @{ $agent{AU} } ) {
$data{ $dt->ymd }->{AU} = $data{ $dt->ymd }->{AU} + 1;
$hit = 1;
}
if ($hit) {
$data{ $dt->ymd }->{ALL} = $data{ $dt->ymd }->{ALL} + 1;
}
}
close $fh;
}
#print Dumper \%data;
print "date,DOCOMO,AU,SB,ALL\n";
foreach my $ymd ( sort keys %data ) {
printf "%s,%d,%d,%d,%d\n", $ymd, $data{$ymd}->{DOCOMO}, $data{$ymd}->{AU}, $data{$ymd}->{SB}, $data{$ymd}->{ALL};
}