You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本批量修改/etc/hosts?sed结合for循环可行吗?

批量修改/etc/hosts多条记录的几种方法

方案1:直接用sed多表达式替换(无需循环)

可以通过sed的-e选项串联多个替换规则,一次完成所有修改,比循环调用sed更高效。

先备份原文件避免出错:

cp /etc/hosts /etc/hosts.bak

执行批量替换(输出到临时文件后覆盖原文件):

sed -e '/^.*\sB\s/s/^[0-9.]* /2.1.1.3   /' \
    -e '/^.*\sE\s/s/^[0-9.]* /2.1.1.54  /' \
    -e '/^.*\sG\s/s/^[0-9.]* /2.1.1.25  /' /etc/hosts > /tmp/hosts.tmp && mv /tmp/hosts.tmp /etc/hosts

或者用-i原地修改(自动生成.bak备份文件):

sed -i.bak -e '/^.*\sB\s/s/^[0-9.]* /2.1.1.3   /' \
    -e '/^.*\sE\s/s/^[0-9.]* /2.1.1.54  /' \
    -e '/^.*\sG\s/s/^[0-9.]* /2.1.1.25  /' /etc/hosts

规则说明:

  • /^.*\sB\s/:精准匹配第二字段为B的行(\s匹配空格,避免误匹配类似AB的字段)
  • s/^[0-9.]* /新IP /:替换行首的IP地址部分为目标IP,保留后续字段不变

方案2:将修改规则存入文件,用sed批量读取

如果需要修改的规则数量较多,可以把替换规则单独存到文件中,让sed读取执行,便于后续维护。

  1. 创建规则文件update_hosts.sed:
/^.*\sB\s/s/^[0-9.]* /2.1.1.3   /
/^.*\sE\s/s/^[0-9.]* /2.1.1.54  /
/^.*\sG\s/s/^[0-9.]* /2.1.1.25  /
  1. 执行替换:
sed -i.bak -f update_hosts.sed /etc/hosts

方案3:用awk实现灵活匹配与格式对齐

如果需要严格保持字段的空格排版(比如示例中的对齐效果),awk的格式化输出会更精准:

awk 'BEGIN {
    # 定义IP映射表:键是第二字段,值是目标IP
    ip_map["B"] = "2.1.1.3"
    ip_map["E"] = "2.1.1.54"
    ip_map["G"] = "2.1.1.25"
}
{
    if ($2 in ip_map) {
        # 用printf保证字段对齐,格式可根据需求调整
        printf "%-10s %-5s %s\n", ip_map[$2], $2, $3
    } else {
        print $0
    }
}' /etc/hosts > /tmp/hosts.tmp && mv /tmp/hosts.tmp /etc/hosts

关于是否需要for循环

不需要。循环调用sed会重复打开和读取/etc/hosts文件,效率低下。上述几种方案都能一次性完成所有修改,比循环更高效、简洁。


内容的提问来源于stack exchange,提问作者test good1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:55:24