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<<EOF 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<<EOF 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:文本替换 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 <<EOF 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