Com o Windows PowerShell , você poderia fazer algo nos moldes de:
Get-Content *.log |
Where-Object { $_.StartsWith('Command:') } |
Group-Object {
$null = $_ -match '^Command: (\w+)';
$Matches[1]
} |
Select-Object Name,Count
Para o meu arquivo de teste, isso gera uma saída como
Name Count
---- -----
foo 2
bar 2
baz 1
O código acima simplesmente lê os arquivos de log linha por linha, empurrando cada linha pelo pipeline, depois filtra as linhas para usar somente aquelas que começam com “Command:”, indicando um comando a ser seguido. Então essas linhas são agrupadas nos comandos individuais. Isso é feito pela expressão regular
^Command: (\w+)
que corresponde à string "Command:" no início da linha, seguido por um ou mais caracteres de palavras. Isto assume que o nome do comando segue os dois pontos e o espaço imediatamente; ajuste o regex de acordo se este não for o caso. O nome do comando é capturado em um grupo de captura que é usado para agrupamento. Depois disso, apenas o nome e a frequência dos comandos são selecionados.
A parte $null =
da correspondência é para suprimir a saída do operador -match
, que retornaria sempre True
aqui. Não queremos agrupar por True bar
, mas apenas por bar
.
ETA: Dependendo de como exatamente sua entrada parece, você pode querer ajustar um pouco as coisas.
-
Permitir comandos vazios:
^Command: (\w*)
-
Permitir caracteres não espaciais arbitrários em nomes de comandos (e comandos vazios):
^Command: ([^ ]*)