2014-11-23 7 views
-1

Я пытаюсь разобрать текстовый файл с линией, подобное этомуPython - Разбор текстового файла

2.000125 IP (tos 0x0, ttl 62, id 0, offset 0, flags [none], proto: TCP (6), length: 40, bad cksum 0 (->4100)!) 150.100.15.6.49153 > 150.100.0.2.57300: S, cksum 0x0000 (incorrect (-> 0xd43b), 0:0(0) win 65535 

в текстовом файле есть около 14 000 других линий. Мне нужно уметь сопоставлять «ttl 62» только с «150.100.15» в левой части сравнительного. Я не слишком уверен, как это сделать в python, так как некоторые строки в файле также имеют «150.100.15» в правой части сравнительного, но я только хочу проанализировать IP-адреса с левой стороны.

+0

Каков ваш ожидаемый результат? –

+0

@AvinashRaj Ну, конечная цель - соответствовать правильному TTL с правильным IP. И иметь возможность также анализировать те, которые не соответствуют, когда они должны быть. –

ответ

0

Это, как я хотел бы сделать это при условии, записи разделяются двоеточием, как они кажутся чтобы быть в вашем примере, он позволяет вам выбрать, какую сторону IP искать, и было бы легко изменить поиск ttl на что-то еще.

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

textfile = "tos 0x0, ttl 62, offset 0, length:40, bad cksum 0 (->4203)!) 150.100.15.6.49153 > 150.100.0.2.57300:" 

ttlToSearchFor = 62 
ipToSearchFor = "150.100.15" 
ipSide = "right" 

#Get rid of colon in the length record 
lengthRename = textfile.replace("length:", "length ") 
#Split by row 
individualRow = lengthRename.split(":") 
#Loop for each record (assuming they're separated by colons) 
for i in range(len(individualRow)): 
    splitByComma = individualRow[i].split(",") 
    #Make sure the record is valid 
    if len(splitByComma) == 5: 
     #Get the ttl or any other info here 
     ttl = splitByComma[1].rstrip().lstrip() 
     #Remove the ttl text and any spaces to leave the number 
     ttlNumber = ttl.replace("ttl", "").replace(" ", "") 
     if ttlNumber == str(ttlToSearchFor): 
      #Get IPs 
      splitBySpace = individualRow[i].split(" ") 
      rightIP = splitBySpace[-1] 
      leftIP = splitBySpace[-3] 
      #Search the left or right (or both) IPs for a match 
      if (ipSide == "right" and ipToSearchFor in rightIP) or (ipSide == "left" and ipToSearchFor in leftIP) or (ipSide == "both" and (ipToSearchFor in leftIP or ipToSearchFor in rightIP)): 
       print individualRow[i] 
       #You found the record 

обновление его, используя Csv материал от должности inspectorg4dget и ваше новую запись, не может проверить его, хотя без этого файла, так что вы, возможно, потребуется, чтобы установить один или два бита

ttlToSearchFor = 62 
ipToSearchFor = "150.100.15" 
ipSide = "right" 

import csv 

with open('path/to/input') as textfile: 
    for row in csv.reader(textfile): 
     #Make sure the record is the correct format 
     if len(row) == 10: 
      #Get the ttl or any other info here 
      ttl = row[1].rstrip().lstrip() 
      #Remove the ttl text and any spaces to leave the number 
      ttlNumber = ttl.replace("ttl", "").replace(" ", "") 
      if ttlNumber == str(ttlToSearchFor): 
       #Get IPs 
       splitBySpace = row[8].split(":")[0].split(" ") 
       rightIP = splitBySpace[-1] 
       leftIP = splitBySpace[-3] 
       #Search the left or right (or both) IPs for a match 
       if (ipSide == "right" and ipToSearchFor in rightIP) or (ipSide == "left" and ipToSearchFor in leftIP) or (ipSide == "both" and (ipToSearchFor in leftIP or ipToSearchFor in rightIP)): 
        print row 
        #You found the record 
+0

Я обновил код. Что бы я сделал, если бы данные были уже не отделены друг от друга запятой? –

+0

Все строки точно отформатированы таким образом, как этот бит. – Peter

+0

Первые несколько строк подобны этому 2.000048 arp кто-имеет 150.100. 0.2 (ff: ff: ff: ff: ff: ff) сообщить 150.100.0.3 и 2.000048 arp ответ 150.100.0.2 is-at 00: 00: 00: 00: 00: 02, а остальные находятся в формате, указанном выше –

0
import csv 

with open('path/to/input') as infile: 
    for row in csv.reader(infile): 
     ttl = row[1] 
     ip = row[4] 
     ip = ip.split(">")[0].split()[-1] 
     ip = ip.split('.')[:3] 
     ip = '.'.join(ip) 
     print("match:", ttl, 'with', ip) 
1

вы используете раскол и re.findall:

>>> import re 
>>> a = 'tos 0x0, ttl 62, offset 0, length:40, bad cksum 0 (->4203)!) 150.100.15.6.49153 > 150.100.0.2.57300:' 
>>> a=a.split('>') 
>>> a 
['tos 0x0, ttl 62, offset 0, length:40, bad cksum 0 (-', '4203)!) 150.100.15.6.49153 ', ' 150.100.0.2.57300:'] 
>>> ttl = re.findall('ttl\s+62',a[0]) 
>>> ttl 
['ttl 62'] 
>>> ip = re.findall('150\.100\.15\.\d{1,3}',a[1]) 
>>> ip 
['150.100.15.6'] 
>>> if ip and ttl: 
...  print(ttl[0],ip[0]) 
... 
ttl 62 150.100.15.6 

реализация:

import re 
f = open('yourfile') 
for a in f: 
    a = a.split('>') 
    ttl = re.findall('ttl\s+62',a[0]) 
    ip = re.findall('150\.100\.15\.\d{1,3}',a[1]) 
    if ip and ttl: 
     print(ttl[0],ip[0]) 
+0

Что делать, если полная строка была 2.000125 IP (tos 0x0, ttl 62, id 0, offset 0, flags [none], proto: TCP (6), длина: 40, bad cksum 0 (-> 4100)!) 150.100. 15.6.49153> 150.100.0.2.57300: S, cksum 0x0000 (неверно (-> 0xd43b), 0: 0 (0) win 65535 –

+0

@JasonWoo Каков ваш ожидаемый результат для вышеуказанного ввода? –

+0

@JasonWoo будет работать – Hackaholic

0

Я бы сделал так через re модуль.

import re 
from collections import OrderedDict 
import csv 
with open('file', 'r') as f: 
    for line in f: 
     m = re.search(r'(ttl\s+\d+).*? (150\.100.15\.\d{1,3})', line.split(' > ')[0]) 
     if m: 
      print(m.group(1) + " " + m.group(2)) 
Смежные вопросы