sed命令详解

命令介绍

sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用。最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。
处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。

特性:

每次仅读取一行内容;
根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
将执行结果输出。


选项:

-n #取消默认的完整输出,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会 屏蔽启动输出,需使用 print 命令来完成输出。
-r #支持扩展正则
-i #真实修改文件内容
= #打印匹配行的行号
-e #允许多项编辑 |a
内部命令
p #打印
s #替换
g #全局
a #追加
i #插入
d #删除
; #多条命令分割符
, #表示连续的命令


实战:

1.查

[root@hebin ~]# sed -n  '1p'  passwd        #打印单行
root:x:0:0:root:/root:/bin/bash
[root@hebin ~]# sed  -n  '1,3p'  passwd     #打印连续的多行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hebin ~]# sed  -n '1p;3p'  passwd     #打印不连续的多行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hebin ~]# sed -n  '$p'  passwd        #打印最后一行
ntp:x:38:38::/etc/ntp:/sbin/nologin

[root@hebin ~]# sed  -n  '/root/p'  passwd      #过滤包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@hebin ~]# sed  -n  '/^root/p'  passwd         #过滤以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@hebin ~]# sed  -nr   '/root|adm/p'  passwd    #过滤root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hebin ~]# sed  -n   '/root/p;/adm/p'  passwd  #过滤root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hebin ~]# sed  -n   '/^root/,/adm/p'  passwd  #过滤以root开头的行到adm的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

.

2.删除

[root@hebin ~]# sed  '1d'  passwd       #删除第一行

[root@hebin ~]# sed  '$d'  passwd           #删除最后一行

[root@hebin ~]# sed  '1,20d'  passwd        #删除连续的多行

[root@hebin ~]# sed  '1d;20d'  passwd       #删除不连续的多行

[root@hebin ~]# sed  '/root/d'  passwd  #删除包含root的行

[root@hebin ~]# sed -r  '/root|adm/d'  passwd   #删除不连续的多行

 [root@hebin ~]# sed  '/root/d;/adm/d'  passwd #删除不连续的多行

 [root@hebin ~]# sed  '/^root/,/adm/d'  passwd  #删除以root开头的行到包含adm的行

 [root@hebin ~]# sed  '1,$d'  passwd        #删除所有

.

3.增

[root@hebin ~]# sed  '$aoldboy'  sort.log       #在文件的最后一行追加oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
[root@hebin ~]# sed   '1aoldboy'  sort.log  #在文件的第一行后面追加oldboy
abc/1
oldboy
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2

[root@hebin ~]# sed  '1ioldboy'  sort.log       #在第一行的前面插入oldboy
oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@hebin ~]# sed  '$ioldboy'  sort.log       #在最后一行前面插入oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
oldboy
fgrf/2

[root@hebin ~]# sed  '1ioldboy\noldgirl'  sort.log  #插入多行
oldboy
oldgirl
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@hebin ~]# sed  '$aoldboy\noldgirl'  sort.log  #追加多行 
abc/1   
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
oldgirl

.

4.替换(改)

[root@hebin ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@hebin ~]# sed  's#root#oldboy#g'  passwd  #把所有的root替换为oldboy   全局替换 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

[root@hebin ~]# sed  's#root#oldboy#'  passwd   #替换每一行第一个匹配条件的
oldboy:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

[root@hebin ~]# sed  '10s#root#oldboy#g'  passwd        #针对行进行替换 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin

[root@hebin ~]# sed  '10,11s#root#oldboy#g'  passwd     #操作多行替换  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
oldboy
[root@whb ~]# sed -n '/nologin$/s@root@****@gp' /etc/passwd #匹配以nologin结尾的, 把root天换成****.
operator:x:11:0:operator:/****:/sbin/nologin                  
点赞

发表回复