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