sed:替换主机文件中的 ip,使用主机名作为模式

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

我正在学习 sed,但我很难理解它。

我有带动态 ip 的 adsl,所以我想将当前 ip 放在主机文件上。

下面的脚本只告诉我当前的 wan 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 总是记录我 "connect from unknown [x.x.x.x]"(其中 x.x.x.x 是我的 wan ip!)并且它无法解析该 ip。我想也许如果我在主机文件上指定与我的 fqdn host/domain 相关的内容,它会更好地工作。

谢谢 塞尔吉奥.

您需要将 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

您可以使用一个简单的 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 的行中将所有内容 .* 替换为 $IP 选项卡 $HOST.

使用 sed

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

[0-9]+\. 查找所有与此模式连续 4 次匹配 1 个或多个数字的行然后模式 peep.strudel.com 。模式周围的括号 peep.strudel.com 将其保存为 </code> 然后替换整个用你的变量和你的新 ip 模式。</p> <p>另一个approach:instead将模式保存到一个名为IP的变量,你可以在sed命令行中执行你的命令行来获取新的IP。</p> <pre><code> sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com)/$(dig +short myip.opendns.com @resolver1.opendns.com)/"

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