Eu tenho o Apache
arquivo de log, 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
command-line
sort
Kokizzu
fonte
fonte
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
poderia fazer isso ..Respostas:
Como indicado nos comentários.
A inserção da saída
sort
organiza a saída em ordem alfabética / numérica.Este é um requisito, porque
uniq
corresponde apenas a linhas repetidas, ou seja,Se você usar
uniq
esse arquivo de texto, ele retornará o seguinte:Isso ocorre porque os dois
a
s são separados pelob
- eles não são linhas consecutivas. No entanto, se você primeiro classificar os dados em ordem alfabética, comoEm seguida
uniq
, removerá as linhas repetidas. A-c
opção deuniq
conta o número de duplicatas e fornece saída no formato:Referências:
sort(1)
uniq(1)
fonte
printf '%s\n' ①.php ②.php | sort | uniq -c
dá-me2 ①.php
php\nphp
①.php
classifica o mesmo que②.php
na minha localidade, porque nenhuma ordem de classificação é definida para aqueles①
e②
caracteres na minha localidade. Se você quiser únicos valores para quaisquer valores de byte (lembre-se caminhos de arquivo não são necessariamente texto), então você precisa para corrigir o local para C:| LC_ALL=C sort | LC_ALL=C uniq -c
.A resposta aceita está quase completa. Você pode adicionar um extra
sort -nr
no final para classificar os resultados com as linhas que ocorrem com mais frequência primeiroopções uniq :
opções de classificação :
No caso específico em que as linhas que você está classificando são números, você precisa usar em
sort -gr
vez desort -nr
, ver o comentáriofonte
-n
opção.tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. O primeiro comando substitui espaços por novas linhas, permitindo que o restante do comando funcione conforme o esperado.sort -gr
resolve isso.-g
: compare de acordo com o valor numérico geral (em vez de-n
: compare de acordo com o valor numérico da string).-gr
mas acho que a saída deuniq -c
será como tal quesort -nr
funcionará conforme o-gr
funciona melhor. Tente estes dois exemplos, diferindo apenas nos sinalizadores g e n:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
eecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. O primeiro classifica incorretamente, mas não o segundo.Você pode usar uma matriz associativa em awk e depois -optionally- tipo :
resultado:
fonte