sed:在hosts文件中替换ip,使用hostname作为模式

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.


rep*_*ero 5

使用 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)