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 条评论
暂无评论