sed命令介绍及语法格式


1.sed是什么
字符流编辑器stream editor


2 sed功能与版本
1)处理纯文本文件
2)增加、删除、修改、查询
3)sed –version


3.语法格式
sed [选项][sed指令][输入文件]
sed -i.bak ‘s#oldboy#oldgirl#g’ oldboy.txt
-i ---参数
s---sed命令/指令
g---小尾巴/修饰


4.sed命令执行流程
sed ‘找谁干啥’
找谁------条件(查找)
干啥------命令 替换、删除、增加


5.创建测试环境
cat>person.txt<101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF


例1:查询单行文本 显示某一行
#p sed指定,打印模式空间内容
#-n sed选项,取消默认输出

[root@oldboyedu38-nb ~]# sed '1p' person.txt
101,oldboy,CEO
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu38-nb ~]# sed -n '1p' person.txt
101,oldboy,CEO
[root@oldboyedu38-nb ~]# sed -n '3p' person.txt
103,Alex,COO

[root@oldboyedu-39-nb ~]# sed -n '2p' person.txt
102,zhangyao,CTO
[root@oldboyedu-39-nb ~]# sed -n '1p' person.txt
101,oldboy,CEO
显示文件的最后一行
[root@oldboyedu-39-nb ~]# sed -n '$p' person.txt
105,feixue,CIO


例2: 查询连续多行文本
显示连续的多行,从哪里来到哪里去 '1,4p'
指定p前面没有地址范围,那么默认匹配所有行

1)数字地址范围--推荐 行号
显示第2行到第4行的内容,包含第2行和第4行
[root@oldboyedu38-nb ~]# sed -n '2,4p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

2)正则地址范围-模糊,容易找多了
[root@oldboyedu38-nb ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
[root@oldboyedu38-nb ~]# sed -n '/o.y/p' person.txt
101,oldboy,CEO
[root@oldboyedu38-nb ~]# sed -n '/o.
y/,/105/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

3)显示这个文件的第1行到第4行
[root@oldboyedu-39-nb ~]# sed -n '1,4p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

4)从包含101的这一行 显示到 包含104的这一行
[root@oldboyedu-39-nb ~]# sed -n '/101/,/104/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO


例3:过滤多个字符串
-r sed选项,支持扩展正则表达式(|、())
默认情况,sed只支持基本正则表达式。
[root@oldboyedu38-nb ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
[root@oldboyedu38-nb ~]# egrep 'oldboy|yy' person.txt ==egrep ==grep -E
101,oldboy,CEO
104,yy,CFO
[root@oldboyedu38-nb ~]# sed -rn '/oldboy|yy/p' person.txt
101,oldboy,CEO
104,yy,CFO

sed里面的正则字符左右必须有“/”。/oldboy/
显示出文件中包含oldboy或 yy的行
[root@oldboyedu-39-nb ~]# egrep "oldboy|yy" person.txt
101,oldboy,CEO
104,yy,CFO
[root@oldboyedu-39-nb ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
[root@oldboyedu-39-nb ~]# sed -n '/oldboy|yy/p' person.txt
[root@oldboyedu-39-nb ~]# sed -nr '/oldboy|yy/p' person.txt
101,oldboy,CEO
104,yy,CFO

重点:
sed 查询单行文本
查询多行文本 使用数字地址范围 sed -n '2,4p' person.txt


例4:查询指定多行
使用分号指定多行
[root@oldboyedu38-nb ~]# sed -n '2p;4p' person.txt
102,zhangyao,CTO
104,yy,CFO
[root@oldboyedu38-nb ~]# sed -n '2p;4p;10p;30p' person.txt

[root@oldboyedu-39-nb ~]# sed -n '1p;4p;5p' person.txt
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO

例5:增加单行文本
我想向person.txt文件中追加2行
106,lidao,UFO
107,bingbing,CEO

:方法1-cat
cat >>person.txt<106,lidao,UFO
107,bingbing,CEO
EOF

方法2-echo
echo "106,lidao,UFO" >>person.txt
echo "107,bingbing,CEO " >>person.txt

echo "106,lidao,UFO回车107,bingbing,CEO"
echo "106,lidao,UFO\n107,bingbing,CEO"
echo -e "106,lidao,UFO\n107,bingbing,CEO"

方法3-sed命令
1)在第2行后面加入一个新行 内容是 oldboyedu.com
[root@oldboyedu-39-nb ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed '2a oldboyedu.com' person.txt
101,oldboy,CEO
102,zhangyao,CTO
oldboyedu.com
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed '2i oldboyedu.com' person.txt
101,oldboy,CEO
oldboyedu.com
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

a ======append 追加
i ======insert 插入

2)最后一行后面追加1行内容
#106,lidao,UFO
[root@oldboyedu-39-nb ~]# sed -n '$p' person.txt
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed '$a 106,lidao,UFO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lidao,UFO

3)最后一行后面追加2行内容
#106,lidao,UFO
#107,bingbing,CEO
[root@oldboyedu-39-nb ~]# sed '$a 106,lidao,UFO\n107,bingbing,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO

dboyedu-39-nb ~]# sed '$a 106,lidao,UFO\n107,bingbing,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO


例6:删除文件内容
d sed指令,删除文本内容
$ 代表文件的最后一行
1)删除第一行
[root@oldboyedu-39-nb ~]# sed '1d' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

2)显示文件内容但是不包含 oldboy
方法1
[root@oldboyedu-39-nb ~]# grep -v "oldboy" person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

方法2
[root@oldboyedu-39-nb ~]# sed '/oldboy/d' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

方法3
[root@oldboyedu-39-nb ~]# awk '/oldboy/' person.txt
101,oldboy,CEO
[root@oldboyedu-39-nb ~]# awk '!/oldboy/' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

方法4
[root@oldboyedu-39-nb ~]# sed -n '1!p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed -n '1,3!p' person.txt
104,yy,CFO
105,feixue,CIO

3)删除指定行
[root@gjw ~]# sed '1d;4d' person.txt
102,zhangyao,CTO
103,Alex,COO
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO

4)删除连续行
[root@gjw ~]# sed '1,4d' person.txt
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO


例7:文本替换br/>1)'s###g'
2)'s@@@g'
替换,只会替换每一行的第一个内容
[root@oldboyedu-39-nb ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed 's#[0-9]#oldboy#' person.txt
oldboy01,oldboy,CEO
oldboy02,zhangyao,CTO
oldboy03,Alex,COO
oldboy04,yy,CFO
oldboy05,feixue,CIO
[root@oldboyedu-39-nb ~]# sed 's#[0-9]#oldboy#g' person.txt
oldboyoldboyoldboy,oldboy,CEO
oldboyoldboyoldboy,zhangyao,CTO
oldboyoldboyoldboy,Alex,COO
oldboyoldboyoldboy,yy,CFO
oldboyoldboyoldboy,feixue,CIO
s 单独使用→将每一行中第一处匹配的字符串进行替换
g 每一行进行全部替换→sed指令s的替换标志之一(全局替换)


例8:-i自动备份功能,先备份,再修改文件内容。
-i参数要放在sed所有参数最后面。
[root@oldboyedu-39-nb ~]# cat person.txt
oldboyoldboyoldboy,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed -r 's#(oldboy)+#101#' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed -ir.bak 's#(oldboy)+#101#' person.txt
[root@oldboyedu-39-nb ~]# cat person.txt
oldboyoldboyoldboy,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# ls -l person.txt*
-rw-r--r-- 1 root root 86 Aug 16 12:05 person.txt
-rw-r--r-- 1 root root 86 Aug 16 12:03 person.txtr.bak

[root@oldboyedu-39-nb ~]# sed -ri.bak 's#(oldboy)+#101#' person.txt
[root@oldboyedu-39-nb ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# ls -l person.txt*
-rw-r--r-- 1 root root 71 Aug 16 12:06 person.txt
-rw-r--r-- 1 root root 86 Aug 16 12:05 person.txt.bak

sed命令修改文件内容的过程。
[root@oldboyedu-39-nb ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# ls -li person.txt
405241 -rw-r--r-- 1 root root 71 Aug 16 12:06 person.txt
[root@oldboyedu-39-nb ~]# sed 's#101#666#g' person.txt
666,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboyedu-39-nb ~]# sed -i.ori 's#101#666#g' person.txt

sed -i.bak 修改文件的内容的时候
1.先把原来的文件移动、改名 person.txt.bak
2.把你修改后的东西 生成新的文件 person.txt
inotify


例9:Ms# # #Ng的使用
#m表示指定m行,s表示替换的动作,ng表示从每行的第几处开始替换
cat >num.txt <1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
EOF

[root@oldboyedu38-nb ~]# sed 's#1#0#g' num.txt
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
[root@oldboyedu38-nb ~]# sed '3s#1#0#g' num.txt
1 1 1 1 1
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
[root@oldboyedu38-nb ~]# sed '3,4s#1#0#g' num.txt
1 1 1 1 1
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
[root@oldboyedu38-nb ~]# sed '3s#1#0#3g' num.txt
1 1 1 1 1
1 1 1 1 1
1 1 0 0 0
1 1 1 1 1
[root@oldboyedu38-nb ~]# sed '3s#1#0#2g' num.txt
1 1 1 1 1
1 1 1 1 1
1 0 0 0 0
1 1 1 1 1
[root@oldboyedu38-nb ~]# sed 's#1#0#2g' num.txt
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0


例10:变量替换
主要考察单引号、双引号的区别
[root@oldboyedu38-nb ~]# x=1
[root@oldboyedu38-nb ~]# y=2
[root@oldboyedu38-nb ~]# sed 's#$x#$y#g' num.txt
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
[root@oldboyedu38-nb ~]# sed "s#$x#$y#g" num.txt
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
[root@oldboyedu38-nb ~]# sed "s#1#2#g" num.txt
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
[root@oldboyedu38-nb ~]# sed s#$x#$y#g num.txt
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
[root@oldboyedu38-nb ~]# sed 's#'$x'#'$y'#g' num.txt
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2


例11:反向引用
() 扩展正则表达式 在sed中作用,能够记忆它包含的一段正则表达式,并可以通过\1 \2 \3 ... \9 调取出来
sed -r '()'


例12:企业案例:系统开机启动项优化
除了下面5个服务以外都关闭
crond sshd network sysstat rsyslog

[root@gjw ~]# chkconfig --list|grep 3:on|sed -r 's#(.).0.#\1#g'|egrep -v 'crond|sshd|network|sysstat|rsyslog'|sed -r 's#(.)#chkconfig \1 off#g'|bash
[root@gjw ~]# chkconfig --list|grep 3:on
crond 0:off 1:off 2:off 3:on 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off