recursive help examples español egrep bash shell grep

bash - help - Contar el número de apariciones de token en un archivo



man grep español (6)

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

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

Tengo un registro de acceso del servidor, con marcas de tiempo de cada solicitud http, me gustaría obtener un recuento del número de solicitudes en cada segundo. Utilizando sed y cut -c , hasta ahora he logrado cortar el archivo solo a las marcas de tiempo, como:

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 gustaría obtener es la cantidad de veces que aparece cada marca de tiempo única en el archivo. Por ejemplo, con el ejemplo anterior, me gustaría obtener una salida que se vea así:

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 sellos de tiempo a una lista de tokens únicos, con la esperanza de poder usar grep como

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

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

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


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


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.


Usando awk :

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


Creo que estás buscando

uniq --count

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


La 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 fue ordenado:

name1 name2 name3 name2 name2 name3 name1

Por lo tanto, las ocurrencias no se seguían entre sí, y uniq no funciona como da:

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

Sin embargo, con el script awk:

name1:2 name2:3 name3:2