Próbuję przeanalizować informacje podane podczas prowadzenia "TCPDump -nnqt".

Przykładowa wyjście wygląda tak:

IP 10.0.0.11.60446 > 10.0.0.232.22: tcp 0
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 176
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 80

Do tej pory mogłem usunąć:

Pierwszy IP / Drugi IP

(?<=IP\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
(?<=\s>\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

TCP lub UDP / rozmiar

(?<=:\s)(.{1,3})
(?<=tcp |udp )(\d+)

Nie udało mi się przewidzieć numerów portów, które są ostateczne cyfry na końcu OD. Moja próba niepełnosprawna wygląda tak:

(?<=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{,6}

Co jest nie tak z moim wyrazem? Czy jest inny sposób, aby to zrobić, że nie widzę?

1
kee7a 17 sierpień 2014, 01:26

3 odpowiedzi

Najlepsza odpowiedź

Nie jestem pewien, dlaczego bierzesz części, których potrzebujesz na raz. Możesz po prostu wziąć je wszystkie w jednym Idź (zawaliłem również twój wzór IP):

IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<protocol>\d+)

regex101 demo

import re

reg = re.compile(r"IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<size>\d+)")

for line in input_lines:
    m = reg.match(line)
    print(m.group("IP1"))
    print(m.group("Port1"))
    print(m.group("IP2"))
    print(m.group("Port2"))
    print(m.group("size"))
2
Jerry 16 sierpień 2014, 21:46

Dlaczego nie tylko analizować całą rzecz za pomocą jednego regexa? Korzystając z grup, nadal można oddzielić różne części. Na przykład:

import re

regex_string = r'IP (?P<first_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+) > (?P<second_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+): (?P<protocol>tcp|udp) (?P<port_num>\d{1,5})'
ip_regex = re.compile(regex_string)

#info contains the output of tcpdump
for match in ip_regex.finditer(info):
    print(match.group("first_ip"))
    print(match.group("second_ip"))
    print(match.group("protocol"))
    print(match.group("port_num"))

Oto świetna strona internetowa do przetestowania wyrażeń regularnych, jeśli go potrzebujesz.

0
Alex 16 sierpień 2014, 21:38

Wypróbuj to wyrażenie regularne

/^.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+).*?([a-z]+)\s(\d+)$/g   

Próbny

0
hex494D49 16 sierpień 2014, 21:39