Сопоставьте строки из файла и проанализируйте их на Python

У меня есть этот файл с разными строками, и я хочу взять только некоторую информацию из каждой строки (а не всей ее), вот пример того, как выглядит файл:

18:10:12.960404 IP 132.227.127.62.12017 > 134.157.0.129.53: 28192+ A? safebrowsing-cache.google.com. (47) 18:10:12.961114 IP 134.157.0.129.53 > 132.227.127.62.12017: 28192 12/4/4 CNAME safebrowsing.cache.l.google.com., A 173.194.40.102, A 173.194.40.103, A 173.194.40.104, A 173.194.40.105, A 173.194.40.110, A 173.194.40.96, A 173.194.40.97, A 173.194.40.98, A 173.194.40.99, A 173.194.40.100, A 173.194.40.101 (394) 18:13:46.206371 IP 132.227.127.62.49296 > 134.157.0.129.53: 47153+ PTR? b._dns-sd._udp.upmc.fr. (40) 18:13:46.206871 IP 134.157.0.129.53 > 132.227.127.62.49296: 47153 NXDomain* 0/1/0 (101) 18:28:57.253746 IP 132.227.127.62.54232 > 134.157.0.129.53: 52694+ TXT? time.apple.com. (32) 18:28:57.254647 IP 134.157.0.129.53 > 132.227.127.62.54232: 52694 1/8/8 TXT "ntp minpoll 9 maxpoll 12 iburst" (381) ....... ....... 

Это результат вывода DNS-запроса, поэтому из него я хочу извлечь эти элементы: [timestamp], [srcip], [src prt], [dst ip], [dst prt], [domaine (если существует)] , [соответствующие адреса ips]

Посмотрев на старые темы веб-сайта, я обнаружил, что re.match () – отличный и полезный способ сделать это, но поскольку, поскольку вы видите, что каждая строка отличается от другой, я как бы потеряна, какая-то помощь будет Отлично, вот код, который я написал до сих пор, и это правильно:

 def extractDNS(filename): objList = [] obj = {} with open(filename) as fi: for line in fi: line = line.lower().strip() #18:09:29.960404 m = re.match("(\d+):(\d+):(\d+.\d+)",line) if m: obj = {} #New object detected hou = int(m.group(1)) min = int(m.group(2)) sec = float(m.group(3)) obj["time"] = (hou*3600)+(min*60)+sec objList.append(obj) #IP 134.157.0.129.53 m=re.match("IP\s+(\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}).(\d+)",bb) if m: obj["dnssrcip"] = m.group(1) obj["dnssrcport"] = m.group(2) # > 134.157.0.129.53: m = re.match("\s+>\s+(\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}).(\d+):",line) if m: obj["dnsdstip"] = m.group(1) obj["dnsdstport"] = m.group(2) tstFile3=open("outputFile","w+") tstFile3.write("%s\n" %objList) tstFile3.close() extractDNS(sys.argv[1]) 

Я знаю, что после этого я должен сделать, если есть другие утверждения, потому что то, что происходит после них, различно каждый раз, и я показал в 3 случаях, что получаю общий доступ в каждом выходном файле dns, который:
– A? а затем CNAME, точный домен и IP-адреса,
– PTR? за которым следует NXDOmain, означает, что домен не существует, поэтому я просто проигнорирую эту строку,
– ТЕКСТ? а затем домен, но он дает только слова, поэтому я проигнорирую этот два

Я только хочу, чтобы запрос, что их ответы содержат IP-адреса, которые в этом случае являются A?

Если вы знаете, что первые пять столбцов всегда присутствуют, почему бы вам просто не разделить линию и не обработать их напрямую (использовать дату и время для метки времени и вручную анализировать IP-адреса / порты). Затем вы можете использовать свое регулярное выражение для сопоставления только записей CNAME и содержимого, которое вас интересует, из этого одного поля. Нет необходимости проводить регулярное сканирование по разным возможностям, если вы не собираетесь использовать результат. Итак, если он не соответствует форме CNAME, вам все равно, как это будет обрабатываться. По крайней мере, так оно и есть.

Как сказал user632657 выше, вам не нужно заботиться о строках, которые вам, ну, не волнует. Просто используйте одно регулярное выражение для этой строки, и если оно не соответствует, игнорируйте эту строку:

pattern = re.compile( r'(\d{2}):(\d{2}):(\d{2}\.\d+)\s+IP\s+(\d+\.\d+\.\d+\.\d+)\.(\d+)\s+>\s+(\d+\.\d+\.\d+\.\d+)\.(\d+):\s+(\d+).*?CNAME\s+([^,]+),\s+(.*?)\s+\(\d+\)' )

Это будет соответствовать только записям CNAME. Вам нужно только определить это один раз, вне вашего цикла. Затем в цикле:

 try: hour, minute, seconds, source_ip, source_port, dst_ip, dst_port, domain, records = pattern.match( line ).groups() except: continue records = [ r.split() for r in records.split( ', ' ) ] 

Это вызовет все поля, о которых вы просили, в соответствующих переменных, и проанализируйте связанные IP-адреса в список пар (класс, IP), который, как я полагаю, будет полезен: P