#!/usr/bin/perl open F, "</var/log/rambler.access.log" or die "can't open: $!\n"; @mass=<F>; close F; for $gr(grep{!$m{$_}++} map{/S?E?T (.*?) / if /usr/ or m!/~user/!} @mass){ for $line(@mass){ ($ip, $n, $m, $data, $k, $method, $url, $protocol, $status, $size, $from, $brouser) = split /\s/ => $line; push @{$hash{$gr}{$ip}}, $size if $line=~m!$gr!; } } for $a(sort keys %hash){ my ($u, $j); print "file $a: \n\t"; for $key(sort keys %{$hash{$a}}){ $j++; print " '$key' \t => [ "; print 1+$#{$hash{$a}{$key}}; my $i; for(@{$hash{$a}{$key}}){$i+=$_} print " $i"; $u+=$#{$hash{$a}{$key}}+1; print " ]\n\t"; } print " dlya $a hitov $u, hostov $j\n"; print "\t\n"; }эта программа сплитит каждую строчку лог-файла по разделютелю пробел. Если написать обработчик логов, т.е. программу, которая анализирует, по чему можно сплитить лог, то все здорово. А вообще по хорошему, необходимо, чтобы при установке программы она сама запрашивала, какие логи за что ответственны и как их анализировать. Главный принцип работы - структурирование по ip-адресу, строится хеш для страницы, потом хеш для адреса, и массив каждому ключу этого хеша вес скачанной информации. Рамерность массива - число запросов данного ip к данному файлу. сумма элементов for(@{$hash{$a}{$key}}){$i+=$_} - полный рамер величины информации, выкачанной пользователем. При помощи небольших изменений(тут нужно знать схему построения хеша хешей массивов) можно выделять и сортировать любую информацию по любым броузерам или охвату территории. Соотвественно условие map{/S?E?T (.*?) / if /usr/ or m!/~user/!} говорит о том, что нужно сплитить. Изменим программу допустим как-то так:
#!/usr/bin/perl use CGI 'param'; $dir1=param('d1'); $dir2=param('d2'); open F, "</var/log/rambler.access.log" or die "can't open: $!\n"; @mass=<F>; close F; for $gr(grep{!$m{$_}++} map{/S?E?T (.*?) / if /$dir1/ or m!$dir2!} @mass){ for $line(@mass){ ($ip, $n, $m, $data, $k, $method, $url, $protocol, $status, $size, $from, $brouser) = split /\s/ => $line; push @{$hash{$gr}{$ip}}, $size if $line=~m!$gr!; } } for $a(sort keys %hash){ my ($u, $j); print "file $a: \n\t"; for $key(sort keys %{$hash{$a}}){ $j++; print " '$key' \t => [ "; print 1+$#{$hash{$a}{$key}}; my $i; for(@{$hash{$a}{$key}}){$i+=$_} print " $i"; $u+=$#{$hash{$a}{$key}}+1; print " ]\n\t"; } print " dlya $a hitov $u, hostov $j\n"; print "\t\n"; }Вводя команду вида bash2-05$ log.pl d1=www d2=/~user/ получим данные о числе заходов пользователя на данную страницу и статистику по файлам. Не знаю, как насчет других анализаторов логов, но этот намного легковесней и состоит из пары десятков строк. Но, он имеет очень большой минус, он весь логфайл держит в памяти, т.к. для полной статистики по логфайлу необходимо анализировать весь лог. Введя условия в map{/S?E?T (.*?) / if /usr/ or m!/~user/!}, можно ограничить выборку конкретной директорией. Хотя впрочем это не настолько трудная задача, можно читать каждую дирректорию по отдельности. В любом случае при анализе логов происходит полное чтение логфайла, в предложенном варианте программы чтение однократное, но и машину повесить может. Но, вобщем, это решабельно...