2008-09-24 19 views
9

Tengo un registro de acceso al servidor, con marcas de tiempo de cada solicitud http, me gustaría obtener un recuento del número de solicitudes en cada segundo. El uso de sed, y cut -c, hasta ahora he logrado cortar el archivo reducido a sólo las marcas de tiempo, tales como:Contar el número de apariciones de token en un archivo

22-Sep-2008 20:00:21 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:24 +0000
22-sep-2008 20:00:24 +0000

Lo que me encantaría es el n La mayoría de las veces, cada marca de tiempo única aparece en el archivo. Por ejemplo, con el ejemplo anterior, me gustaría obtener una salida que se parece a:

22-Sep-2008 20:00:21 +0000: 1
22-Sep-2008 20:00: 22 0000: 3
22-Sep-2008 20:00:24 +0000: 2

he usado sort -u para filtrar la lista de marcas de tiempo a una lista de tokens únicos, con la esperanza de que pudiera use grep como

grep -c -f <file containing patterns> <file> 

pero esto solo produce una sola línea de un gran total de líneas coincidentes.

Sé que esto se puede hacer en una sola línea, conectando algunas utilidades juntas ... pero no puedo pensar en cuál. ¿Nadie sabe?

Respuesta

32

creo que estás buscando

uniq --count 

-c, --count líneas prefijo por el número de ocurrencias

+5

Tenga en cuenta que con otros conjuntos de datos es posible que tenga que ordenar (1) antes de uniq (1), como uniq solo grupo adj acent duplicados. –

+0

Sí, pero el OP ya dijo que había ordenado las cosas, así que supuse que estaba al tanto de ese tipo de cosas ... –

+0

Tuve que usar 'uniq -c' en OS X,' --count' me dio un error. –

-2

tal vez usar xargs? No puedo poner todo junto en mi cabeza en el lugar aquí, pero use xargs en su orden -u para que, por cada segundo único, pueda grep el archivo original y hacer wc -l para obtener el número.

1

Usar AWK con matrices asociativas podría ser otra solución para algo como esto.

1

En caso de que quieren la salida en el formato especificado originalmente (con el número de ocurrencias al final):

uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/' 
0

Usando awk:

cat file.txt | awk '{count[$1 " " $2]++;} \ 
        END {for(w in count){print w ": " count[w]};}' 
0

solución de Tom:

awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt 

funciona de manera más general.

Mi archivo no se solucionó:

name1 
name2 
name3 
name2 
name2 
name3 
name1 

Por lo tanto las ocurrencias no estaban siguiendo uno al otro, y uniq no funciona, ya que da:

1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1 

Con el guión awk sin embargo:

name1:2 
name2:3 
name3:2 
Cuestiones relacionadas