Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sed: replace ip in hosts file, using hostname as pattern

I'm learning about sed but it is very difficult to me understand it.

I have adsl with dynamic ip so and i want to put current ip on hosts file.

This following script just tells me the current wan ip address and no more:

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

The result:

192.42.7.73

So, i have a line on hosts file with the old ip address:

190.42.44.22   peep.strudel.com

and i want to update host file like this:

192.42.7.73    peep.strudel.com

How can i do it? I think i can use the hostname as pattern...

The reason of doing this is because my server is a client of my router, so it access the internet thru its gateway and not directly. And postfix always is logging me that "connect from unknown [x.x.x.x]" (where x.x.x.x is my wan ip!) and it can't resolve that ip. I think that maybe if i specify this relating with my fqdn host/domain, on hosts file it will works better.

Thanks Sergio.

like image 583
sergius Avatar asked Feb 11 '15 15:02

sergius


People also ask

What is modify host file path?

Hit the start menu or press the Windows key and start typing Notepad. Right-click Notepad and choose Run as administrator. In Notepad, click File then Open… In the File name field, paste the following path in: c:\Windows\System32\Drivers\etc\hosts. Now you'll be able to edit and save changes to your HOSTS file.


3 Answers

You can use a simple shell script:

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

Explanation:

sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts means in the line which contains $HOST replace everything .* by $IP tab $HOST.

like image 169
Tiago Lopo Avatar answered Oct 03 '22 14:10

Tiago Lopo


using sed

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

. [0-9]+\. find all lines that matches 1 or more digits with this pattern 4 consecutive times then pattern peep.strudel.com .The parenthesis around the pattern peep.strudel.com save it as \1 then replace the whole patten with your variable and your new ip.

another approach:instead of saving pattern to a variable named IP, you can execute your command line inside sed command line to get the new IP .

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

using 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")}'
like image 36
repzero Avatar answered Oct 03 '22 14:10

repzero


You need to include the sed code inside double quotes so that the used variable got expanded.

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

Add -i parameter to save the changes made. In basic sed \(..\) called capturing group. \{min,max\} called range quantifier.

Example:

$ 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
like image 28
Avinash Raj Avatar answered Oct 03 '22 13:10

Avinash Raj