2015-02-11 133 views
9

我正在學習sed,但是我很難理解它。sed:替換主機文件中的ip,使用主機名作爲模式

我有adsl動態ip,所以我想把當前IP上的主機文件。

這下面的腳本只是告訴我當前的廣域網IP地址,並沒有更多:

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

結果:

192.42.7.73 

所以,我對主機上符合舊的IP地址文件:

190.42.44.22 peep.strudel.com 

,我想更新主機文件是這樣的:

192.42.7.73 peep.strudel.com 

我該怎麼辦?我想我可以使用主機名作爲模式...

這樣做的原因是因爲我的服務器是我的路由器的客戶端,所以它通過它的網關訪問互聯網,而不是直接訪問互聯網。而且postfix總是記錄我「從unknown [x.x.x.x]」連接(其中x.x.x.x是我的wan IP!),並且它無法解析該IP。我認爲,也許如果我指定這與我的fqdn主機/域相關,在主機文件上它會更好地工作。

謝謝 塞爾吉奧。

回答

3

使用sed的

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

[0-9]+\.查找與此模式匹配1個或多個數字的所有行連續4次然後模式peep.strudel.com。圍繞模式peep.strudel.com的括號將其另存爲\1,然後用您的變量和您的新IP替換整個模式。

另一種方法:不是將模式保存到名爲IP的變量,而是在sed命令行中執行命令行以獲取新的IP。

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

使用GAWK

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

謝謝,我用你的第二個例子(所有在1命令行),添加-i參數sed保存文件,如Avinash拉吉和蒂亞戈建議。它的作品:)(注意:我添加了更多的空間之前(+ peep.strudel.com),匹配原始帖子的編輯) – sergius 2015-02-12 11:03:13

+0

太棒了! :D.I我在命令行中使用這段代碼「+」照顧空間peep.strudel.com – repzero 2015-02-12 11:06:46

+0

我+1這個問題,以便您可以達到15代表投票! – repzero 2015-02-12 11:09:07

1

您需要在雙引號內包含sed代碼,以便使用的變量得到擴展。

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

添加-i參數以保存所做的更改。在基本sed \(..\)被稱爲捕獲組。 \{min,max\}稱爲範圍量詞。

例子:

$ 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

感謝,它幫助我你的 「-i」 參數:) – sergius 2015-02-12 11:04:32

+0

[接受這裏的答案,這有助於你最的人。(HTTP:// stackoverflow.com/help/accepted-answer) – 2015-02-12 11:10:27

10

您可以使用一個簡單的shell腳本:

#! /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 

說明:

sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts意味着其中包含$HOST取代一切.* B的連線y $IP標籤$HOST

+0

感謝蒂亞戈,我喜歡你的解決方案,非常簡單明瞭,明白。 – sergius 2015-02-12 11:05:24

+0

很高興幫助。 – Tiago 2015-02-12 11:23:46