Я сделал скрипт, который поможет мне анализировать файлы журнала доступа без SSH к серверу (у меня есть только файл). Он подсчитывает и сортирует количество управляемых сайтов по IP-адресам, но я обнаружил, что для больших файлов это занимает слишком много времени (это ОЧЕНЬ элементарно). Я не хотел использовать скомпилированное приложение и не иметь SSH к серверу, поэтому я обратился к Powershell.
$sw = [Diagnostics.Stopwatch]::StartNew()
$input_path = ‘c:\temp\access_log2’
$ip_file = ‘c:\temp\IPs.txt’
$output_file = ‘c:\temp\SORTED.txt’
$regex = '\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b'
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $ip_file
get-content $ip_file | group-object -noelement | Sort-Object count -descending > $output_file
get-Content $output_file -First 25
$sw.Stop()
$sw.Elapsed
Я тоже пробовал
$regex = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’
для файла размером 5 МБ (14,4 КБ) это заняло 18 минут, для файла размером 37 МБ (158,5 КБ) - более 3 часов
Секундомер только для моего тестирования. Сценарий предназначен только для извлечения IP-адреса, их подсчета и сортировки по наиболее часто встречающимся. Возможно, запись в файл - самое большое замедление, но я не слишком знаком с переменными, хранящимися в оперативной памяти. Я думаю, что есть лучший способ извлечь IP-адреса (может быть, просто использовать первые 15 символов в строке?). Вот пример строк, объединенный формат журнала
21.198.52.3 - - [06/Aug/2017:11:31:54 -0400] "GET / HTTP/1.0" 301 452 "-" "-"
154.212.178.24 - - [06/Aug/2017:11:10:44 -0400] "GET /images/12345.jpg HTTP/1.1" 200 212443 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.2; +http://ahrefs.com/robot/)"
Любой совет?