4
23
2013
7

使用 sed 来切换 hosts 文件项

本文来自依云's Blog,转载请注明。

工作中经常会需要将一个域名映射到本地以调试,但是其余时间又需要让其正常解析。手工修改/etc/hosts文件烦耶!

于是有了以下脚本:

#!/bin/bash

if [[ $UID -eq 0 ]]; then
  sed -i '/^#127\.0\.0\.1\s\+example\.org/s/^#//;t;/^127\.0\.0\.1\s\+example\.org/s/^/#/' \
    /etc/hosts
  systemctl restart dnsmasq
else
  grep -m1 -F 'example.org' /etc/hosts
fi

使用 sed 是因为觉得没必要用 awk 这样复杂的东西,也正好更深入学习下 sed。此代码中用到了t命令,它的语义是:

当当前行的上一个s命令成功(至少替换一次)时,跳转到指定的标签。如果没有指定标签,则跳转到脚本尾部。上边的命令中,当example.org域名这行被注释掉时,s命令成功去掉其前的注释符,然后t命令跳过后边加注释符的s命令,到达脚本尾部。

标签使用冒号定义。以上命令使用标签时如下所示:

  sed -i '/^#127\.0\.0\.1\s\+example\.org/s/^#//;te;/^127\.0\.0\.1\s\+example\.org/s/^/#/;:e' \
    /etc/hosts

当然,以上脚本还做了另一件事:当以普通用户身份执行时,不修改 hosts 文件,而是显示相关行以查看状态。

Category: shell | Tags: sed shell | Read Count: 10955
eleven.i386 说:
Apr 23, 2013 09:46:28 PM

仙子喵, 为啥不加入手工指定"ip 域名"呢? 我更多的时候是需要临时设置未知的host来进行测试,用完就可以clear掉了.用上面的脚本 必然要事先想所有可能的host对应关系都写好.. 在优化下嘛,咱就可以直接捡现成的了<(=o^_^)o

Avatar_small
依云 说:
Apr 24, 2013 12:09:27 AM

我没那么复杂的需求啦~~~

kent 说:
May 01, 2013 11:58:02 PM

我个人感觉和你正好相反。 

除了那些经典的sed-oneliner,实现一个功能awk要比sed简单的多。 因为awk自己就是个脚本语言,功能丰富。 sed不那么直接。最简单例子,用个变量,做个if/else判断 (你的t)或来个for/while loop (sed也得用标签)。。

比如你这个需求,if ..else 多轻松。

但awk没有-i, 得 awk '..' file >/tmp/foo && mv /tmp/foo /path/to/file

Avatar_small
依云 说:
May 02, 2013 12:10:45 AM

sed 语法元素简单当然实现相同的东西就不简单啦。就像汇编指令都挺简单的,但写个东西可难了。不过这个任务不想用 awk 啦。

mv 的话,你那个好像有本地提权漏洞呢。

kent 说:
May 25, 2013 07:03:32 PM

awk 也能 in-place了。
http://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-Inplace

arch已更新

Avatar_small
krystism 说:
Aug 05, 2013 01:43:11 PM

个人感觉sed 比 awk 更复杂。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com