sed: заменить ip в файле hosts, используя имя хоста в качестве шаблона

Я изучаю sed, но мне очень трудно это понять.

У меня есть adsl с динамическим ip, поэтому я хочу поставить текущий ip на файл hosts.

Этот следующий скрипт просто сообщает мне текущий IP-адрес WAN и не более:

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

Результат:

192.42.7.73

Итак, у меня есть строка на файл hosts со старым IP-адресом:

190.42.44.22   peep.strudel.com

и я хочу обновить файл хоста следующим образом:

192.42.7.73    peep.strudel.com

Как мне это сделать? Я думаю, что я могу использовать имя хоста в качестве шаблона...

Причина этого заключается в том, что мой сервер является клиентом моего маршрутизатора, поэтому он получает доступ к Интернету через свой шлюз, а не напрямую. И postfix всегда регистрирует меня, что "соединение с неизвестным [xxxx]" (где xxxx - мой wan ip!), И это не может разрешить этот ip. Я думаю, что, возможно, если я укажу это, связанное с моим хостом / доменом fqdn, на файле hosts это будет работать лучше.

Спасибо, Серхио.

3 ответа

Решение

используя сед

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 -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")}'

Вы можете использовать простой сценарий оболочки:

#! /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 заменить все .* от $IP табуляция $HOST,

Вам нужно включить код sed в двойные кавычки, чтобы используемая переменная была расширена.

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

добавлять -i Параметр для сохранения внесенных изменений. В базовом седе \(..\) называется группа захвата. \{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
Другие вопросы по тегам