ubuntuusers.de

Reguläre Ausdrücke_ganzes Wort ausschließen

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

linzus

Anmeldungsdatum:
31. Dezember 2015

Beiträge: 147

Hi Leute, ich habe folgendes Problem: ich möchte dass mir grep alle IP-Adressen ausgibt, jedoch keine subnetzmasken. Dazu habe ich folgenden Code:

1
grep -Eo '([0-9]{1,3}[\.]){3}[0-9]{1,3}'))

Mein Problem ist, dass ich zwar Zeichenklassen ala [^a-z] oder [^1-3] ausschließen kann, jedoch nicht ganze "Wörter" (oder hier Zahlenfolgen) wie (^255). ich suche etwas wie:

grep -Eo '(([0-9]{1,3}[\.])&&(^255.)){3}[0-9]{1,3}'))

Google hat mich auf look-around assertions gebracht, allerdings sind sie in diesem Falle nicht so richtig zielführend...

Vielen Dank und ebensolche Grüße, ...

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

Man könnte die Ausgabe filtern:

grep -Eo  "(\.[0-2]?[0-9]{1,2}){4}" | grep -v "^255"

Oder man gibt die Ranges gezielt an:

grep -Eo  '([01][0-9][0-9]|2[0-4][0-9]|25[0-4])(\.?[0-2]?[0-9]{1,2}){3}'

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

linzus schrieb:

ich möchte dass mir grep alle IP-Adressen ausgibt, jedoch keine subnetzmasken. Dazu habe ich folgenden Code

Das ist schwierig.

Google hat mich auf look-around assertions gebracht, allerdings sind sie in diesem Falle nicht so richtig zielführend...

Doch, schon. Das Matching auf eine valide IPv4-Adresse wäre folgender (Hinweis: beim testen mit grep, muss die Option -P gesetzt werden).

1
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

Ich würde diesen Ausdruck verwenden und dann alle Ergebnisse, die mit 255 anfangen entfernen. Das ist natürlich unsauber, da nicht alle Subnetzmasken mit 255 anfangen müssen.

seahawk1986 schrieb:

grep -Eo  "(\.[0-2]?[0-9]{1,2}){4}" | grep -v "^255"

Matched nur, wenn vor der IP noch ein Punkt steht.

grep -Eo  '([01][0-9][0-9]|2[0-4][0-9]|25[0-4])(\.?[0-2]?[0-9]{1,2}){3}' 

Matched nur auf Adressen, deren erstes Oktett dezimal ausgedrückt dreistellig ist.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

In Ruby und Perl kannst Du Assertions verwenden. So ungefähr könnte es mit "negative lookahead" gehen:

1
$ ruby -ne 'puts $_.scan(/\b(?!255|254|252|248|240|224|192|128)\d{1,3}(?:\.\d{1,3}){3}\b/)' datei

Das erschlägt aber nur das erste Octet.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

rklm schrieb:

Das erschlägt aber nur das erste Octet.

Dieser Ansatz ist vermutlich schneller, validiert aber nicht, dass der String eine valide IP ist. Ob das relevant ist, kommt auf das Format der Daten des TS an.

linzus

(Themenstarter)

Anmeldungsdatum:
31. Dezember 2015

Beiträge: 147

Hallo Leute,

vielen Dank für eure Hilfe. Ich muss mir die unterschiedlichen Lösungen erst mal in Ruhe ansehen. Funktionieren tun sie jedenfalls, das habe ich schon getestet ☺

Viele Grüße, ...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

misterunknown schrieb:

rklm schrieb:

Das erschlägt aber nur das erste Octet.

Dieser Ansatz ist vermutlich schneller, validiert aber nicht, dass der String eine valide IP ist. Ob das relevant ist, kommt auf das Format der Daten des TS an.

Hier im Thema ging es ja nur um das Ausschließen. Und mein Ausdruck sollte illustrieren, wie das geht. Der Einfachheit halber habe ich deshalb nur einen simplen Match gebaut.

Antworten |