-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtask3.py
83 lines (68 loc) · 3.56 KB
/
task3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""
Дан лог сервера, который содержит логи операций с машинами. Для идентификации машин используется IPv4 адреса.
Нужно определить частоту встечаемости IP адресов.
На вход принимается лог.
На выходе ожидается список адресов с количеством упоминаний адреса (список IP-адресов, отсортированных в порядке убывания количества упоминаний). Если несколько IP-адресов имеют одинаковое количество упоминаний, то к ним применяется сортировка строк по убыванию.
Важно:
• В логе может встречаться текст похожий на IP, но не являющимся им. Например, 0.0.0.1000
• Также в логах могут встречаться маски подсети, например, 192.168.0.0/16. Их не нужно считать как ip.
• Строки логов могут быть пустые.
• Строка лога не обязательно содержит ip, но в логах обязательно содержится хотя бы один ip.
Например, если лог содержит следующие записи:
[2019-08-29 13:00:13] login to 10.64.64.8
[2019-08-29 13:15:35] logout from 95.213.255.16
[2019-08-29 14:14:33] ssh connection to 10.64.64.8
[2019-09-01 14:14:35] request from 35.228.158.140 to 10.64.65.8
[2019-09-01 14:14:35] login to 35.228.158.140
[2019-09-01 15:29:01] login to 35.228.158.140
Программа должна вывести на экран:
35.228.158.140 3
10.64.64.8 2
95.213.255.16 1
10.64.65.8 1
Sample Input:
[2019-08-29 13:00:13] login to 10.64.64.8
[2019-08-29 13:15:35] logout from 95.213.255.16
[2019-08-29 14:14:33] ssh connection to 10.64.64.8
[2019-09-01 14:14:35] request from 35.228.158.140 to 10.64.65.8
[2019-09-01 14:14:35] login to 35.228.158.140
[2019-09-01 15:29:01] login to 35.228.158.140
Sample Output:
35.228.158.140 3
10.64.64.8 2
95.213.255.16 1
10.64.65.8 1
"""
import re
import socket
import sys
def check_ip(addr: str) -> bool:
"""Проверка на существование ip-адреса"""
try:
socket.inet_aton(addr)
return True
except socket.error:
return False
def main():
data = sys.stdin.readlines()
results_dict = {}
# Цикл по каждой строке
for e in data:
# Находим все ip адреса по строке, если они есть - едем в цикле
for ip in re.findall(r"[0-9]+(?:\.[0-9]+){3}", e):
if check_ip(ip):
# Если нет в словаре- значит первый раз встретили
if ip not in results_dict:
results_dict[ip] = 1
# Если есть в словаре- значит уже не первый раз
else:
results_dict[ip] += 1
# Формируем список результатов из словаря
results_list = list(results_dict.items())
# Сортируем по кол-ву повторений элементов
results_list.sort(key=lambda x: x[1], reverse=True)
# Выводим все на экран
for item in results_list:
print(f"{item[0]} {item[1]}")
if __name__ == "__main__":
main()