2015-02-11 17 views
9

Ich lerne über sed aber es ist sehr schwer für mich, es zu verstehen.sed: Ersetze ip in der hosts Datei, benutze hostname als Muster

Ich habe Adsl mit dynamischen IP so, und ich möchte aktuelle IP auf Hosts-Datei setzen.

Das folgende Skript sagt mir nur die aktuelle WAN-IP-Adresse und nicht mehr:

IP=$(dig +short myip.opendns.com @resolver1.opendns.com) 
echo $IP 

Das Ergebnis:

192.42.7.73 

Also, ich habe eine Linie auf Hosts mit der alten IP-Adresse Datei :

190.42.44.22 peep.strudel.com 

und ich möchte, wie diese Host-Datei aktualisieren:

192.42.7.73 peep.strudel.com 

Wie kann ich es tun? Ich denke, ich kann den Hostnamen als Muster verwenden ...

Der Grund dafür ist, weil mein Server ein Client meines Routers ist, so dass es das Internet über sein Gateway und nicht direkt zugreifen. Und postfix protokolliert mich immer, dass "connect from unknown [x.x.x.x]" (wobei x.x.x.x meine wan ip ist!) Und es kann diese IP nicht auflösen. Ich denke, dass, wenn ich dies in Verbindung mit meinem fqdn Host/Domain, auf Hosts-Datei, es funktioniert besser.

Danke Sergio.

Antwort

3

unter Verwendung von sed

sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(+peep.strudel.com)/$IP\1/" 

. [0-9]+\. finden Sie alle Linien, die 1 oder mehr Ziffern mit diesem Muster 4 Mal hintereinander dann Muster peep.strudel.com. Die Klammer um das Muster peep.strudel.com speichern Sie es als \1 dann ersetzen Sie den gesamten Patten mit Ihrer Variablen und Ihre neue IP.

ein anderer Ansatz: Statt Muster in eine Variable namens IP zu speichern, können Sie Ihre Befehlszeile innerhalb der sed-Befehlszeile ausführen, um die neue IP zu erhalten.

sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(+peep.strudel.com)/$(dig +short myip.opendns.com @resolver1.opendns.com)\1/" 

gaffen mit

gawk -v IP=$IP '/ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(+peep.strudel.com).*/{print gensub(/ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(+peep.strudel.com)/,IP"\\1","g")}' 
+0

danke, ich habe Ihr zweites Beispiel (alle in 1 Befehlszeile), hinzugefügt-i Parameter zu sed zum Speichern der Datei, wie Avinash Raj und Tiago vorgeschlagen. Es funktioniert :) (Hinweis: Ich fügte mehr Leerzeichen vor (+ peep.strudel.com), die Bearbeitung der ursprünglichen Post) – sergius

+0

groß! : D.Ich habe die Leerzeichen in meiner Kommandozeile mit diesem Code "+" nach peep.strudel.com behandelt. – repzero

+0

I +1 diese Frage, damit du 15 Wiederholer erreichen kannst, um abzustimmen! – repzero

1

Sie müssen den sed-Code in doppelte Anführungszeichen einschließen, damit die verwendete Variable erweitert wird.

sed "s/\b\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}\b/$IP/g" file 

hinzufügen -i Parameter, um die Änderungen zu speichern. In grundlegenden sed \(..\) namens einfangende Gruppe. \{min,max\} genannt Bereich Quantifizierer.

Beispiel:

$ IP='192.42.7.73' 
$ echo '190.42.44.22 peep.strudel.com' | sed "s/\b\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}\b/$IP/g" 
192.42.7.73 peep.strudel.com 
+0

Dank half es mir Ihre "-i" Parameter :) – sergius

+0

[Accept einem der hier Antworten, die Ihnen am meisten geholfen.] (Http: // stackoverflow.com/help/accepted-answer) –

10

Sie können einen einfachen Shell-Skript verwenden:

#! /bin/bash 

IP=$(dig +short myip.opendns.com @resolver1.opendns.com) 

HOST="peep.strudel.com" 

sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts 

Erläuterung:

sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts bedeutet in der Linie, die $HOST alles .* b ersetzen enthält y $IP Registerkarte $HOST.

+0

danke Tiago, ich mag Ihre Lösung, sehr einfach und klar zu verstehen. – sergius

+0

Froh, dass es geholfen hat. – Tiago