如何用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读取执行,便于后续维护。
- 创建规则文件
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 /
- 执行替换:
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
相关产品推荐
相关产品推荐

