ser*_*ius 11 ip bash replace sed hosts
我正在学习sed,但我很难理解它.
我有动态IP的adsl所以我想把当前的IP放在主机文件上.
以下脚本只是告诉我当前的wan ip地址,而不是:
IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
echo $IP
Run Code Online (Sandbox Code Playgroud)
结果:
192.42.7.73
Run Code Online (Sandbox Code Playgroud)
所以,我在主机文件上有一个旧的IP地址行:
190.42.44.22 peep.strudel.com
Run Code Online (Sandbox Code Playgroud)
我想像这样更新主机文件:
192.42.7.73 peep.strudel.com
Run Code Online (Sandbox Code Playgroud)
我该怎么做?我想我可以使用主机名作为模式......
这样做的原因是因为我的服务器是我的路由器的客户端,所以它通过其网关而不是直接访问互联网.而后缀总是记录我"连接从未知[xxxx]"(其中xxxx是我的万能!)并且它无法解析该IP.我想也许如果我指定这与我的fqdn主机/域有关,在主机文件上它会更好.
谢谢塞尔吉奥.
Tia*_*opo 13
您可以使用简单的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
Run Code Online (Sandbox Code Playgroud)
说明:
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\1/"
Run Code Online (Sandbox Code Playgroud)
.
[0-9]+\.
找到所有与此模式连续 4 次匹配 1 个或多个数字的所有行,然后使用模式peep.strudel.com
。模式周围的括号peep.strudel.com
将其保存为,\1
然后用您的变量和新 ip 替换整个模式。
另一种方法:您可以在 sed 命令行中执行命令行来获取新 IP,而不是将模式保存到名为 IP 的变量中。
sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com)/$(dig +short myip.opendns.com @resolver1.opendns.com)\1/"
Run Code Online (Sandbox Code Playgroud)
使用呆呆
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")}'
Run Code Online (Sandbox Code Playgroud)