Geralmente, identifico algumas características em um arquivo de log que desejo distinguir e obtenho porcentagens. Isso pode ser feito facilmente com o sed, substituindo qualquer coisa que você não precise em cada linha e, em seguida, contando a ocorrência de cada um. Por exemplo, para distinguir entre ocorrências do Linux e do Windows em um arquivo de log, você poderia fazer:
$ cat some.log | sed -r 's/.*(Windows|Linux).*//' | sort | uniq -c | sort -rn
23940 Windows
12390 Linux
Isso faz com que você conte os valores absolutos de cada traço que você está procurando, mas não a porcentagem, por isso ainda não é o ideal.
Parece que awk não pode percorrer facilmente duas vezes as linhas para calcular primeiro as porcentagens totais e depois as de saída, mas com um pequeno hack podemos primeiro adicionar uma linha no topo que mostre a soma de todas as características correspondentes:
$ ... | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}'
Total 36330
Windows 23940
Linux 12390
Finalmente, agora que temos o total, podemos facilmente calcular e imprimir porcentagens usando isso:
$ ... | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'
Total 36330 100.00%
Windows 23940 65.90%
Linux 12390 34.10%
O one-liner combinado seria então:
cat some.log | sed -r 's/.*(Windows|Linux).*//' | sort | uniq -c | sort -rn | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}' | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'
Em que some.log
é o arquivo que você deseja inspecionar e Windows|Linux
é uma lista de termos delimitada por canal para correspondência / distinção.
Se você quiser remover a linha Total no final, uma vez que ela se torna um pouco irrelevante, você pode acrescentar | tail -n +2
a ela.