本文来自依云'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 文件,而是显示相关行以查看状态。
Apr 23, 2013 09:46:28 PM
仙子喵, 为啥不加入手工指定"ip 域名"呢? 我更多的时候是需要临时设置未知的host来进行测试,用完就可以clear掉了.用上面的脚本 必然要事先想所有可能的host对应关系都写好.. 在优化下嘛,咱就可以直接捡现成的了<(=o^_^)o
Apr 24, 2013 12:09:27 AM
我没那么复杂的需求啦~~~
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
May 02, 2013 12:10:45 AM
sed 语法元素简单当然实现相同的东西就不简单啦。就像汇编指令都挺简单的,但写个东西可难了。不过这个任务不想用 awk 啦。
mv 的话,你那个好像有本地提权漏洞呢。
May 25, 2013 07:03:32 PM
awk 也能 in-place了。
http://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-Inplace
arch已更新
May 25, 2013 07:25:32 PM
看到啦 :-)
Aug 05, 2013 01:43:11 PM
个人感觉sed 比 awk 更复杂。