Calcula ocorrências dentro de um período de tempo a partir do arquivo de log [closed]

1

Eu preciso usar utilitários UNIX que implementam algoritmos de divisão e conquista fora do núcleo para diminuir a quantidade de memória virtual usada (limite de 1 mb). Eu tenho um grande conjunto de dados que é um arquivo de log do apache. Eu sou capaz de extrair todos os endereços IP e a data (convertidos em time (s) unix) e armazená-los em um arquivo csv chamado hits.

ip,timestamp
62.172.72.131,1041502001    
62.121.107.115,1041809792
163.28.16.1,1043258352
216.37.59.126,1044304131
68.104.188.224,1044472900
66.137.118.69,1044543502
62.172.72.131,1041502098
207.181.42.20,1044646708
205.156.184.254,1045670100
80.225.248.61,1045779615
200.44.24.157,1046214366
193.63.247.68,1046260886
66.176.248.72,1046317786
216.249.85.109,1046566502
68.44.222.12,1046638290
130.113.69.66,1048009156
143.43.220.157,1048026293

Agora preciso criar um arquivo de sessões, que consiste no IP, na hora e no número de ocorrências. Uma sessão dura 30 minutos. Por exemplo, para% hit 62.172.72.131 , ele deve examinar o arquivo e encontrar todos os hits com esse endereço IP e determinar se está nessa sessão. O sétimo hit tem esse endereço IP e 1041502097 - 1041502001 = 97 sec , que está dentro de 30 minutos, então temos que escrever 62.172.72.131,97,2 no arquivo de sessões. Isso precisa ser agrupado por endereço IP e calcular sessões para esse endereço IP, ou seja, uma sessão é de 30 minutos, se um endereço IP fora dessa sessão (> 1800 seg) que uma nova linha de sessão tiver que ser gerado.

Eu trabalhei no seguinte código

awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1]= $2 }END {for (i in arr) {...}}' hits.csv | sort -n 

Atualmente, não tenho idéia de como calcular as sessões e todas as duplicatas desaparecem quando eu imprimo i e arr [i]. Eu pensei em classificá-lo pelo endereço IP, então todos os hits do mesmo IP apareceriam sequencialmente.

    
por Bryce Ramgovind 09.03.2016 / 12:14

1 resposta

1

Eu não tenho certeza do que você realmente precisa ... Isto é principalmente uma contribuição, não uma resposta.

A seguir, calculamos um número de "sessão" e contamos o número de a[session][ip] hits

#!/usr/bin/gawk -f

BEGIN  { FS=OFS="," }
       { session = int($2/1800); a[session][$1] ++ }
END    { for(session in a){
           for(ip in a[session]){
               print a[session][ip], ip , session
           }
         }
       }

Notas:

  • 1800 = 30m * 60s
  • se for útil imprimir por meio de classificação: print a[session][ip], ip , session | "sort -Vr"
por 09.03.2016 / 12:36

Tags