#!/usr/bin/perl -p use strict; use warnings; use Geo::IP; our %geoip; BEGIN { $|=1; } chomp; my @f = split/\t/,$_,-1; my ($time, $host, $user, $ip, $response, $size, $scheme, $method, $url, $referer, $location, $agent) = @f; $agent ||= ""; if ($agent !~ /compatible/i) { $agent =~ s/\(.*?\)//g; } else { $agent =~ s/.*compatible[:; ]*//i; $agent =~ s/\)$//; } $agent =~ s/;.*//; $agent =~ s/ +/ /g; $agent =~ s/^ +| +$//; $agent = join " ", map { s/\..*//; s/\/.*//; $_ } grep {!/WebKit|Version|Presto|Win16|Glue|Me\.Dium/} split / /, $agent; $agent =~ s/[ 0-9]*$//; if ($agent =~ /\bChrom/i) { $agent =~ s/\s+Safari\S*//ig; } if ($agent =~ /\bLynx/i) { $agent = "Lynx"; } $agent =~ s/.* //; #if (length($agent) < 8) { $agent .= " "x7; } #$referer =~ s{(//.*?)/.+}{$1}; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($time); $time = sprintf("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); $response =~ s/ .*//; my $geoip = geoip($ip); @f = ($time, $host, $agent, $user, $geoip, $response, $size, $scheme, $method, $url, $referer, $location); $_ = join("\t", @f)."\n"; sub geoip { my ($ip) = @_; return $geoip{$ip} ||= do { my $gi = Geo::IP->open("/home/sam/soft/GeoIPCity.dat", GEOIP_STANDARD); my $record = $gi->record_by_addr($ip); if ($record) { my $country = $record->country_code||""; my $state = $record->region||""; my $city = $record->city||""; "$country/$state/$city"; } else { $ip; } } }