运维三剑客之sed

  SED(stream editor)擅长实现数据的替换,增加,删除,选取等(以行为单位进行处理),默认是无破坏性的,不变更源文件(可根据需要添加参数实现修改)。

  • 基本语法
sed [OPTION] 'Command' file

  其中Command里用于实现各种复杂逻辑。

最常用的OPTION举例

  以下是比较实用的一些参数,其他参数参考man手册。

参数 功能
-n 禁止默认输出,默认所有来自STDIN的数据一般都会被列出到终端上。-n只打印被sed特殊处理过的行,可以借助该参数实现类似grep的效果
-i 增加-i参数后,将结果直接写入文本,实现对目标的变更操作

  sed的参数并不是其主要特色,接下来要说的Command才是重点。

常用的Command说明

  这里我们举例进行说明。

  • 替换

  将目标替换为指定字符串。

  对每行,符合要求的字符串进行替换操作,其中s表示替换,g表示全局操作(没有g的话只替换每行第一处):

  sed 's/要被取代的字串/新的字串/g' file

[root@localhost ~]# grep device anaconda-ks.cfg 
network  --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
[root@localhost ~]# sed -i 's/ens33/eth0/g' anaconda-ks.cfg 
[root@localhost ~]# grep device anaconda-ks.cfg 
network  --bootproto=dhcp --device=eth0 --onboot=off --ipv6=auto --no-activate
[root@localhost ~]# 
  • 增加

  在指定位置插入内容。

  在第二行后面增加一行a good day:

  sed -i '2a a good day' anaconda-ks.cfg

  在第二行之前增加一行a good day:

  sed -i '2i a good day' anaconda-ks.cfg

[root@localhost ~]# head -5 anaconda-ks.cfg 
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
[root@localhost ~]# sed -i '2a a good day' anaconda-ks.cfg 
[root@localhost ~]# head -5 anaconda-ks.cfg 
#version=DEVEL
# System authorization information
a good day
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
[root@localhost ~]# 
  • 删除

  删除指定位置内容。

  删除第3-5行的内容:

  sed -i '3,5d' anaconda-ks.cfg

[root@localhost ~]# head -5 anaconda-ks.cfg 
#version=DEVEL
# System authorization information
a good day
a good day
a good day
[root@localhost ~]# sed -i '3,5d' anaconda-ks.cfg 
[root@localhost ~]# head -5 anaconda-ks.cfg 
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
[root@localhost ~]# 
  • 选取

  选取匹配内容输出。

  打印第二行:

  sed -n '2p' anaconda-ks.cfg

[root@localhost ~]# head -5 anaconda-ks.cfg 
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
[root@localhost ~]# sed -n '2p' anaconda-ks.cfg 
# System authorization information
[root@localhost ~]# 

高级实例

  这里给出俩个我们在日常运维过程中非常实用的案例解释。

  • 解注释

  作为运维人员,我们常常需要配合业务调整进行配置文件的变更。为方便操作会把不同需求对应的一些参数提前写好然后注释掉,只让当前需求的参数生效。那么,当每次去操作这些配置文件的变更时,如果还手动去删除那些#号,就太没效率啦。这里我们用sed实现对特定行的#删除,也就是解注释的效果。

  例如,解注WEBSOCKET_FACTORY_CLASS所在的行:

sed -i '/WEBSOCKET_FACTORY_CLASS/s/^#//' /root/dev_ops/dev_ops/settings.py

  这个命令需要拆开看:   在开头的'/WEBSOCKET_FACTORY_CLASS/这个部分表示匹配含有WEBSOCKET_FACTORY_CLASS的行进行操作。接下来s/^#//表示,对符合要求的每行,定位到行首的#,对行首的#进行替换操作,替换为空字符串,即删掉行首#。

  • 加注释

  和上面相反,我们再来看一下怎么加注释。

  例如,注释WEBSOCKET_FACTORY_CLASS所在的行:

sed -i '/WEBSOCKET_FACTORY_CLASS/s/^/#&/' /root/dev_ops/dev_ops/settings.py

  这个命令,前半部分同样匹配到我们需要操作的行,接下来的s/^/#&/表示,对符合要求的整个行(以任意字符开头的部分),替换为#&。其中&表示匹配到的整行内容的一个暂存。

  一般来讲,只要会基本的组合,就能实现十分高级的操作,所以不需要刻意去死记这些骚操作,找个地方记录下来到了关键时刻会用即可,请把宝贵的脑细胞留着,生活中还有更重要的东西值得我们去记忆。


发表评论

评论列表,共 0 条评论

    暂无评论