online - re.sub python ejemplos
Python: ¿cómo analizar y verificar la hora? (2)
El primer paso sería analizar datos, puede hacerlo con esto:
data = [(ip, datetime.strptime(time, ''%d/%b/%Y:%H:%M:%S:%f'')) for (ip, time) in re.findall("((?:[0-9]{1,3}/.){3}[0-9]{1,3}).+?/[(.+?) -", text)]
donde el text
es el texto de entrada.
Esto devolverá una lista con una tupla para cada entrada. El primer elemento de la tupla será la dirección IP, luego la fecha.
El siguiente paso es ver cuáles ocurren en un intervalo de 1 segundo y tienen la misma ip:
print set([a[0] for a in data for b in data for c in data if (datetime.timedelta(seconds=0)<a[1]-b[1]<datetime.timedelta(seconds=1)) and (datetime.timedelta(seconds=0)<a[1]-c[1]<datetime.timedelta(seconds=1)) and (datetime.timedelta(seconds=0)<b[1]-c[1]<datetime.timedelta(seconds=1))])
Salida:
set([''28.252.89.140''])
¿Cómo extraigo la dirección IP que aparece 10 veces en un intervalo de un segundo?
En el siguiente caso:
241.7118.197.10
28.252.8
Podría recopilar los datos para determinar dónde IP es clave y el valor contiene marcas de tiempo para determinada IP. Luego, cada vez que se agrega la marca de tiempo, puede verificar si la IP dada tiene tres marcas de tiempo dentro de un segundo:
from datetime import datetime, timedelta
from collections import defaultdict, deque
import re
THRESHOLD = timedelta(seconds=1)
COUNT = 3
res = set()
d = defaultdict(deque)
with open(''test.txt'') as f:
for line in f:
# Capture IP and timestamp
m = re.match(r''(/S*)[^/[]*/[(/S*)'', line)
ip, dt = m.groups()
# Parse timestamp
dt = datetime.strptime(dt, ''%d/%b/%Y:%H:%M:%S:%f'')
# Remove timestamps from deque if they are older than threshold
que = d[ip]
while que and (dt - que[0]) > THRESHOLD:
que.popleft()
# Add timestamp, update result if there''s 3 or more items
que.append(dt)
if len(que) >= COUNT:
res.add(ip)
print(res)
Resultado:
{''28.252.89.140''}
Arriba se lee el archivo de registro que contiene el registro línea por línea. Para cada línea se usa una expresión regular para capturar datos en dos grupos: IP y marca de tiempo. Entonces strptime
se usa para analizar el tiempo.
El primer grupo (/S*)
captura todo menos el espacio en blanco. Entonces [^/[]*
captura todo excepto [
y /[
captura el carácter final antes de la marca de tiempo]. Finalmente (/S*)
se usa nuevamente para capturar todo hasta el próximo espacio en blanco. Ver ejemplo en regex101 .
Una vez que tenemos la IP y la hora, se agregan a defaultdict
donde IP se utiliza como clave y el valor es deque
de timestamps. Antes de agregar una nueva marca de tiempo, las antiguas se eliminan si son más antiguas que THRESHOLD
. Esto supone que las líneas de registro ya están ordenadas por tiempo. Después de la adición, se verifica la longitud y si hay COUNT
o más elementos en la cola, la IP se agrega al conjunto de resultados.