2013-02-18 17 views
10

Dies ist für eine Aufgabe, also habe ich keine andere Wahl, als sed zu verwenden.sed - So extrahieren Sie die IP-Adresse mit sed?

Gegeben eine Datei Nachrichten, wie kann ich alle IP-Adressen extrahieren und sie ausdrucken?

Ich versuchte zunächst

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages 

Aber es gedruckt nichts. Nach einigen Recherchen fand ich heraus, dass sed nicht nicht-gierige Betreiber wie unterstützt? und |.

Ich habe mein Gehirn zerbrochen, aber ich kann mir keinen Weg vorstellen, dies ohne die nicht-gierigen Betreiber zu tun. Wie kann ich das machen?

+3

Verwenden 'sed -r'. Es unterstützt, wovon du sprichst. –

+0

Vielen Dank, funktioniert super. Ich vermute, ich habe nicht genug Nachforschungen angestellt. – MrDiggles

+2

Denken Sie daran, dass das '-r' Flag eine' GNU sed' Erweiterung ist. Es wird nicht mit anderen sds funktionieren. – Steve

Antwort

6

Verwendung sed -r (extended Regex) oder escape die Erfassungsgruppen mit \

18

wird mehr geeignet dort (wenn Sie sed haben, sollten Sie grep haben):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages 

Das ist Ihre eigene regex ohne Modifikation (getestet OK)

+0

Wer/warum wurde dieser Beitrag abgelehnt? –

+1

Ich habe deine Antwort nicht abgelehnt, aber das OP hat gesagt, dass er 'sed' benutzen muss. Das ist wahrscheinlich der Grund. Allerdings stimme ich Ihnen zu, "Grep" wäre passender als "Sed-n" /.../ p'. – Steve

+2

Eigentlich gibt es einen Unterschied. Und es ist schwer zu erkennen, was das OP eigentlich versucht. Ihr 'grep'-Code gibt nur die IP-Adressen zurück. Das OP versucht möglicherweise tatsächlich, Zeilen mit IP-Adresse abzugleichen und auszudrucken. Das könnte der Grund für den Downvote sein. – Steve

7

Wenn Sie GNU sed haben, können Sie einfach diehinzufügen 10 Flag verwenden EREs:

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file 

Andernfalls müssen Sie bestimmte Zeichen entkommen:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file 

Diese Zeichen sind:

  • Gruppen mit Klammern: (, )
  • Vorkommnis-Klammern: {, }
  • 'oder' Rohre: |
  • nicht gierige Fragezeichen: ?

Allgemeinen (jedoch nicht für Ihren Fall) Ich verwende die IP-Adresse folgende entsprechen:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file 

Oder in Kompatibilitätsmodus:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file 
+0

Funktioniert nicht auf '/ etc/hosts' –

+0

@sputnick: Sie haben Recht, meine Kopie/Paste-Fähigkeit sind grauenhaft. Fest. – Steve

0

Sie das auch tun können:

Fenster:

ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1; 

OSX:

ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;