Como imprimir estatísticas de linhas em um arquivo

0

Frequentemente, encontro porcentagens de computação manualmente depois de filtrar por um arquivo de log para encontrar a proporção de X ou Y nele. Isso pode ser facilmente alcançado através de ferramentas comuns CLI?

    
por Seldaek 22.11.2013 / 11:47

1 resposta

3

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.

    
por 22.11.2013 / 11:47