Existe uma abordagem mais simples (esperançosamente mais rápida) se o ip estiver liderando todas as linhas. Uma simples divisão no espaço deve separar o ip.
Ao processar as linhas, você pode incrementar uma hashtable endereçada pelo ip
$sw = [Diagnostics.Stopwatch]::StartNew()
$input_path = 'c:\Temp\access_log2'
$Hash = @{}
ForEach ($Line in (Get-Content $Input_path)) {
++$Hash[$Line.split(' ')[0]]
}
$Hash.GetEnumerator() | sort -Property Value -desc |Select -First 25
$sw.Stop()
$sw.Elapsed
Exemplo de saída com apenas suas linhas replicadas:
Name Value
---- -----
154.212.178.24 5
21.198.52.3 4
Ticks : 121118
Days : 0
Hours : 0
Milliseconds : 12
Minutes : 0
Seconds : 0
TotalDays : 1,4018287037037E-07
TotalHours : 3,36438888888889E-06
TotalMilliseconds : 12,1118
TotalMinutes : 0,000201863333333333
TotalSeconds : 0,0121118