Organizar e contar o número de ocorrências de linhas

107

Eu tenho Apache logfile, access.log , como contar o número de ocorrências de linha nesse arquivo? por exemplo, o resultado de cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]' é

a.php
b.php
a.php
c.php
d.php
b.php
a.php

o resultado que eu quero é:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 
    
por Kokizzu 26.11.2014 / 12:31

3 respostas

146
| sort | uniq -c

Como afirmado nos comentários.

Pipar a saída para sort organiza a saída em ordem alfabética / numérica.

Este é um requisito porque uniq corresponde apenas a linhas repetidas, ou seja,

a
b
a

Se você usar uniq neste arquivo de texto, ele retornará o seguinte:

a
b
a

Isso ocorre porque os dois a s estão separados pelo b - eles não são linhas consecutivas. No entanto, se você primeiro classificar os dados em ordem alfabética primeiro, como

a
a
b

Em seguida, uniq removerá as linhas repetitivas. A opção -c de uniq conta o número de duplicatas e fornece a saída no formulário:

2 a
1 b

link

link

    
por 26.11.2014 / 12:36
75
[your command] | sort | uniq -c | sort -nr

A resposta aceita está quase completa. Você pode adicionar um sort -nr extra no final para classificar os resultados com as linhas que ocorrem mais frequentemente primeiro

uniq opções:

-c, --count
       prefix lines by the number of occurrences

classificar opções:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons
    
por 17.02.2016 / 15:50
6

Você pode usar uma matriz associativa no awk e, em seguida, -opcionalmente- classificar :

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

saída:

1 c.php
1 d.php
2 b.php
3 a.php
    
por 28.05.2015 / 06:21