Tengo un Apache
archivo de registro, access.log
¿cómo contar el número de ocurrencias de línea en ese archivo? por ejemplo el resultado de cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'
es
a.php
b.php
a.php
c.php
d.php
b.php
a.php
El resultado que quiero es:
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
command-line
sort
Kokizzu
fuente
fuente
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
podría hacer eso ..Respuestas:
Como se indica en los comentarios.
La canalización de la salida
sort
organiza la salida en orden alfabético / numérico.Este es un requisito porque
uniq
solo coincide en líneas repetidas, es decirSi usa
uniq
este archivo de texto, devolverá lo siguiente:Esto se debe a que las dos
a
s están separadas porb
- no son líneas consecutivas. Sin embargo, si primero ordena los datos en orden alfabético primero, comoLuego
uniq
eliminará las líneas repetidas. La-c
opción deuniq
cuenta el número de duplicados y proporciona resultados en la forma:Referencias
sort(1)
uniq(1)
fuente
printf '%s\n' ①.php ②.php | sort | uniq -c
me da2 ①.php
php\nphp
①.php
ordena de la misma manera que②.php
en mi configuración regional porque no se define ningún orden de clasificación para esos①
y los②
caracteres en mi configuración regional. Si quieres únicos valores para los valores de bytes (recuerda rutas de archivos no son necesariamente de texto), entonces usted necesita para corregir la configuración regional en C:| LC_ALL=C sort | LC_ALL=C uniq -c
.La respuesta aceptada está casi completa. Es posible que desee agregar un extra
sort -nr
al final para ordenar los resultados con las líneas que aparecen con mayor frecuencia primeroopciones uniq :
opciones de clasificación :
En el caso particular, donde las líneas que está ordenando son números, debe usarlas en
sort -gr
lugar desort -nr
ver el comentario.fuente
-n
opción.tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. El primer comando reemplaza los espacios con nuevas líneas, permitiendo que el resto del comando funcione como se esperaba.sort -gr
lugar resuelve esto.-g
: compara según el valor numérico general (en lugar de-n
: compara según el valor numérico de la cadena).-gr
pero creo que el resultadouniq -c
será como talsort -nr
y funcionará según lo previsto-gr
funciona mejor. Pruebe estos dos ejemplos, que solo difieren en los indicadores gyn:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
yecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. El primero se clasifica incorrectamente, pero no el segundo.Puede usar una matriz asociativa en awk y luego -opcionalmente- ordenar :
salida:
fuente