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")}'
我正在学习 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")}'