【问题标题】:sed: replace ip in hosts file, using hostname as patternsed:替换主机文件中的 ip,使用主机名作为模式
【发布时间】:2015-04-12 00:17:57
【问题描述】:

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

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

以下脚本只告诉我当前的 wan ip 地址,仅此而已:

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

我该怎么做?我想我可以使用主机名作为模式...

这样做的原因是因为我的服务器是我路由器的客户端,所以它通过网关而不是直接访问互联网。并且后缀总是记录我“从未知 [x.x.x.x] 连接”(其中 x.x.x.x 是我的 wan ip!)并且它无法解析该 ip。我认为,如果我指定这个与我的 fqdn 主机/域相关,在主机文件上它会更好。

谢谢 塞尔吉奥。

【问题讨论】:

    标签: bash replace sed ip hosts


    【解决方案1】:

    你可以使用一个简单的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

    【讨论】:

    • 感谢 Tiago,我喜欢您的解决方案,非常简单易懂。
    • 我发现的一件事是dig 总是返回零退出代码,因此可能会弄乱您的主机文件。出色地使用sed 应该已被接受。
    【解决方案2】:

    使用 sed

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

    [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/"
    

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

    【讨论】:

    • 谢谢,我使用了您的第二个示例(全部在 1 个命令行中),按照 Avinash Raj 和 Tiago 的建议,将 -i 参数添加到 sed 以保存文件。它有效:)(注意:我在(+peep.strudel.com)之前添加了更多空格,与原始帖子的编辑相匹配)
    • 太棒了! :D. 我在 peep.strudel.com 之后使用这段代码“+”来处理命令行中的空格
    • 我 +1 这个问题,这样你就可以达到 15 个代表投票!
    【解决方案3】:

    您需要将 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
    
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多