2016-07-19 10 views
0

Ich möchte bestimmte Mac-Adresse aus einer Protokolldatei extrahieren, die in verschiedenen Formaten angezeigt werden kann.Python - Finden Sie eine bestimmte Mac-Adresse in einer Protokolldatei

Zum Beispiel auf diesen drei Linien:

16. Juni 10.24.28 (2248) login: cli 88-c9-d0-fd-13-65 über TLS-Tunnel)

16. Juni 10.24.35 (2258) login: cli f8: a9: d0: 72: 0a: dd über TLS-Tunnel)

16. Juni 10.24.44 (2273) login: cli 485a.3f12.a35a über TLS-Tunnel)

mit dieser Regex:

([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2} 

Ich kann alle die MAC-Adresse herausbringen, in dem Linux-Befehl weniger.

Angenommen zu suchen 48: 5a: 3f: 12: a3: 5a, wie verwende ich die gleiche Syntax mit einer bestimmten MAC-Adresse in Python?

Ich habe versucht, so etwas zu schreiben:

regex = re.compile(r'([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}') 

for line in file: 
    match = regex.search(line) 

aber offensichtlich funktioniert es nicht.

+0

Haben Sie eine bestimmte MAC-Adresse in einer Datei finden wollen? Wenn ja, würde 'cat exampleFile | grep exampleMACAddress' funktioniert für Sie? – Paradox

+1

Wenn ich das richtig verstehe, suchst du '48 [: .-]? 5a [: .-]? 3f [: .-]? 12 [: .-]? A3 [: .-]? 5a' ? Wenn die Antwort ja lautet, sollten Sie sich einige Regex-Tutorials ansehen. –

+0

Ich suche ** 48: 5a: 3f: 12: a3: 5a ** aber es kann im Format ** 485a.3f12.a35a ** oder ** 48-5a-3f-12-a3- erscheinen 5a ** – bonzix

Antwort

0

können Sie verwenden

r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}|(?:\.?[a-f0-9]{2}){5})\b' 

Siehe regex demo (kompiliert das Regex-Objekt mit der re.I Flagge).

Erklärung:

  • \b - führende Wortgrenze
  • [a-f0-9]{2}-2 xdigits
  • (?: - Beginn einer Nicht-Erfassung Gruppe mit 2 alternativen Mustern:
    • ([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}:
      • ([:-]?) - Gruppe 1 die Erfassung eines Delimiter, dass entweder ein : oder -
      • [a-f0-9]{2} ist - 2 xdigits
      • (?:\1[a-f0-9]{2}){4}-4 Sequenzen des Begrenzungszeichen in Gruppe 1 und 2 xdigits
    • | - oder
    • (?:\.?[a-f0-9]{2}){5}) - 5 Sequenzen eines optionalen (1 oder 9) Punkts (\.?) und 2 x Ziffern.
  • \b - Hinterwortgrenze

Sample Python demo:

import re 
p = re.compile(r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}|(?:\.?[a-f0-9]{2}){5})\b', re.IGNORECASE) 
s = "Jun 16 10:24:28 (2248) Login OK: cli 88-c9-d0-fd-13-65 via TLS tunnel)\nJun 16 10:24:35 (2258) Login OK: cli f8:a9:d0:72:0a:dd via TLS tunnel)\nJun 16 10:24:44 (2273) Login OK: cli 485a.3f12.a35a via TLS tunnel)" 
print([x.group() for x in p.finditer(s)]) 
# => ['88-c9-d0-fd-13-65', 'f8:a9:d0:72:0a:dd', '485a.3f12.a35a'] 
Verwandte Themen