Не могу распарсить результат работы программы, запутался с алгоритмом?

Я не очень силен в программировании, в python тем более.

Моя задача:
Есть txt файл в котором содержится результат работы masscan
Требуется вывести каждый ip со всеми найденными его открытыми портами :

res.txt
Код:
# Masscan 1.0.3 scan initiated Sun Dec 23 23:00:31 2018
# Ports scanned: TCP(1;80-80) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 192.168.1.1 () Ports: 80/open/tcp////
Host: 192.168.1.1 () Ports: 801/open/tcp////
Host: 192.168.1.2 () Ports: 801/open/tcp////
Host: 192.168.1.2 () Ports: 445/open/tcp////
Host: 192.168.1.3 () Ports: 80/open/tcp////
Host: 192.168.1.3 () Ports: 8080/open/tcp////
Host: 192.168.1.3 () Ports: 21/open/tcp////
# Masscan done at Sun Dec 23 23:00:45 2018


Моя задача получить данные в таком формате.

192.168.1.1 80, 801
192.168.1.2 801, 445
192.168.1.3 80, 8080, 21


#!/usr/bin/env python
import sys, re, os

ports = []
ip = None

with open('mres.txt','r') as f:

    for elem in f.readlines():

        if not elem.startswith('#'):
              if ip != None:
                  print('1')
                  if elem.split(' ')[1] == ip:
                      ports.append(elem.split(' ')[3].split('/')[0])
                      continue
                  else:
                      print(ports)
                      print('nmap '+ip +' ports: '+str(ports))
                      ports=[]
              else:
                  print('2')
                  #print('Unic: '+str(ip) + ' port: '+ str(elem.split(' ')[3].split('/')[0]))
                  ip = elem.split(' ')[1]
                  ports.append(elem.split(' ')[3].split('/')[0])
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
AWEme
@AWEme
Retard Soft Inc.
Набросал чутка, пробуйте.

import re
from collections import defaultdict

ips = defaultdict(list)
regular = re.compile(r'Host: ([\d\.]+).+?Ports: (\d+)/')

with open('res.txt', 'r') as f:
    lines = f.read().splitlines()

for line in lines:
    if not line.startswith('#'):
        ip, port = regular.search(line).groups()
        ips[ip].append(port)

for k, v in ips.items():        # Выведет:
    print(k, ', '.join(v))      # 192.168.1.1 80, 801
                                # 192.168.1.2 801, 445
                                # 192.168.1.3 80, 8080, 21

with open('outputfile.txt', 'w') as f: # Запишет тоже самое
    for k, v in ips.items():
        f.write('{} {}\n'.format(k, ', '.join(v)))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы