32、sed命令详解


32.1、sed介绍:

1、sed(sed软件常称做)是流编辑器,是操作、过滤、和转换文本内容的工具;

2、sed的模式空间和保持空间介绍:

(1)模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间;

1)模式空间命令:

-n:清空当前的模式空间,然后读入下一行;

-N:不清空当前的模式空间,然后读入下一行

2)模式空间中的内容为:

1\n101,oldboy,CEO

2\n102,zhangyao,CTO

(2)保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,

而是需要sed命令来进行处理(了解即可);

(3)模式空间与保持空间的关系:

1)模式空间:相当于流水线,文本行在模式空间中进行处理;

1)保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,

但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。

32.2、语法格式:

sed [option] [sed-commands] [input-file]

sed [选项] [sed命令] [输入文件]

sed 可以从管道中获取文件

sed 处理文件的流程(串行的处理):

32.3、sed选项:

-n:标准化输出,只取包含内容的值,通常连"p"一同使用,常用于打印匹配的内容,

否则不匹配的内容也会显示出来(grep匹配自带此功能),只能和-r参数同时使用;

-r:正则表达式规则,只能用于分组替换;

-i:修改文件,只能和-r参数同时使用,且使用时没有输出;

32.4、sed命令:

1、指定sed执行的地址范围:

(1)数字范围:

10{sed-commands} #对第十行进行操作;

10,20{sed-commands} #对第十行到20行进行操作;

10,+20{sed-commands} #对第10行到30行进行操作;

1~2{sed-commands} #奇数行,步长为2;2~2#偶数行;

1~${sed-commands} #第一行到最后一行;

(2)正则匹配:

/oldboy/{sed-commands} #匹配字符串操作;

/oldboy/,/Alex/{sed-commands} #匹配指定的字符串到指定的字符串

(3)两者混合:

1,/oldboy/{sed-commands} #匹配行数和字符串操作;

2、命令参数:

a:追加文本到指定的行后

i:插入文本到指定的行后

d:删除指定的文本或指定的行;

s#源值#替换值#g

s #代表替换指定的字符串;

g #代表命令的替换标志——全局替换标志;

# #表示定界符,也可以使用"/",但是不好区分,最好是使用"#",方便区分;

进行全局字符串匹配的替换

c:替换 ,不常用,了解;

[root@centos6 ~]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

32.5、sed命令操作:

以下的操作都是在sed模式空间中进行,不会对磁盘上的文件进行实际的操作;

sed的模式空间即是,sed在内存中分配的缓存空间;

1、追加:

(1)单行追加:

[root@centos6 ~]# sed '2a 106,dandan,CSO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(2)多行追加:

[root@backup scripts]# sed '2a 106,dandan,CSO\n107,dandan1,CEO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

107,dandan1,CEO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# sed '2a 106,dandan,CSO\

> 107,dandan1,CEO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

107,dandan1,CEO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

2、插入:

(1)单行插入:

[root@centos6 ~]# sed '2i 106,dandan,CSO' person.txt

101,oldboy,CEO

106,dandan,CSO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(2)多行插入:

[root@backup scripts]# sed '2i 106,dandan,CSO\n107,dandan1,CEO' person.txt

101,oldboy,CEO

106,dandan,CSO

107,dandan1,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

3、删除:

(1)单行删除:

[root@centos6 ~]# sed '2d' person.txt

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(2)多行删除:

[root@backup scripts]# sed '2,3d' person.txt

101,oldboy,CEO

104,yy,CFO

105,fcixuc,CIO

4、替换:

替换标志: g:全局标志;数字标志:1 2 3 4;写标志:w;忽略大小写标志:i ;bash 执行标志:e

(不加参数代表每一行)s# # #(不加参数表示第一个字符,g代表整行的字符) :代表对每一行的第一个字符进行匹配替换;

(1)替换文本内容:

1)全局替换:

[root@centos6 ~]# sed '2s#zhangyao#lc#g' person.txt

101,oldboy,CEO

102,lc,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

2)非全局替换:

Ms# # #Ng

# Ms g 对第二行进行全部替换;

[root@backup scripts]# sed "2s#1#0#g" num.txt

1 1 1 1 1

0 0 0 0 0

1 1 1 1 1

1 1 1 1 1

#Ms 对第二行的第一字符进行匹配替换;

[root@backup scripts]# sed "2s#1#0#" num.txt

1 1 1 1 1

0 1 1 1 1

1 1 1 1 1

1 1 1 1 1

#s 对全局的每行的第一个字符进行匹配替换;

[root@backup scripts]# sed "s#1#0#" num.txt

0 1 1 1 1

0 1 1 1 1

0 1 1 1 1

0 1 1 1 1

#Ms Ng 对第2行从第2处以后的内容进行匹配替换;

[root@backup scripts]# sed "2s#1#0#2g" num.txt

1 1 1 1 1

1 0 0 0 0

1 1 1 1 1

1 1 1 1 1

#Ms N 对第2行从第2处进行匹配替换;

[root@backup scripts]# sed "2s#1#0#2" num.txt

1 1 1 1 1

1 0 1 1 1

1 1 1 1 1

1 1 1 1 1

#忽略大小写’i‘参数;

[root@backup scripts]# sed 's#ce#lc#g' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# sed 's#ce#lc#ig' person.txt

101,oldboy,lcO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(2)替换变量:

[root@backup scripts]# vim sed.txt

a

b

a

[root@backup scripts]# x=a

[root@backup scripts]# y=b

[root@backup scripts]# echo $x $y

a b

#需要使用双引号,因为单引号是所见即所得,不能够使用变量;

[root@backup scripts]# sed "s#$x#$y#g" sed.txt

b

b

b

(3)分组替换\(\) \1...\9 :

把全局中取到第一行的oldboy替换成取到的oldboy值;

[root@backup scripts]# vim sed1.txt

i am oldboy teacher

i am oldboy teacher

[root@backup scripts]# sed -r '1s#^.*am ([a-z].*) tea.*$#\1#g' sed1.txt

oldboy

i am oldboy teacher

[root@backup scripts]# sed -nr '1s#^.*am ([a-z].*) tea.*$#\1#gp' sed1.txt

oldboy

#特殊符号&代表被替换的内容:

[root@backup scripts]# sed -r '1,3s#(.*)#--&--#g' person.txt

--101,oldboy,CEO--

--102,zhangyao,CTO--

--103,Alex,COO--

104,yy,CFO

105,fcixuc,CIO

(4)sed的大小写替换方式:

1)参数说明:

\u \U:大写;\l \L:小写;\E:和前面的参数一起使用,代表关闭L\l,U\u的功能;

2)应用实例:

[root@backup scripts]# sed "s#oldboy#\Ulc#g" person.txt

101,LC,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# sed "s#oldboy#\LLC#g" person.txt

101,lc,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# sed "s#oldboy#\L\ELC#g" person.txt

101,LC,CEO #LC还是大写的,没有将LC转化为小写,因为使用\E参数;

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

5、标准化输出(查询):

(1)只显示匹配的内容 -n p

[root@backup scripts]# sed -n '/oldboy/,/Alex/p' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

(2)打印奇数行:

[root@backup scripts]# sed -n '1~2p' person.txt

101,oldboy,CEO

103,Alex,COO

105,fcixuc,CIO

(3)sed模拟cat命令:

[root@backup scripts]# sed '' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(4)sed模拟grep命令:

1)普通模拟:

[root@backup scripts]# sed -n '/oldboy/ p' person.txt

101,oldboy,CEO

2)模拟grep -v:

[root@backup scripts]# sed -n '/oldboy/ !p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(5)模拟head命令:

[root@backup scripts]# sed -n '1,2p' person.txt

101,oldboy,CEO

102,zhangyao,CTO

[root@backup scripts]# sed '2q' person.txt #读取到第二行是停止;

101,oldboy,CEO

102,zhangyao,CTO

(6)sed命令模拟wc命令:

[root@backup scripts]# sed -n '$=' person.txt

5

(7)显示空和末尾,以$符号进行显示:

[root@backup scripts]# sed -n 'l' person.txt

101,oldboy,CEO$

102,zhangyao,CTO$

$

103,Alex,COO$

104,yy,CFO$

105,fcixuc,CIO$

6、sed的其它用法:

(1)修改文件时进行源文件的备份:

[root@backup scripts]# sed -i.bak 's#oldboy#lc#g' person.txt

[root@backup scripts]# cat person.txt

101,lc,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# cat person.txt.bak

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(2)把文件修改后的内容另存为:

此方法可以使用-n -p -i -i.ori 选项;

[root@backup scripts]# sed 's#oldboy#lc#g;w ouput.txt' person.txt

101,lc,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

[root@backup scripts]# cat ouput.txt

101,lc,CEO

备注:

此方法可以对文件进行备份:

sed 'w ouput.txt' person.txt

(3)等于(=)号:

[root@backup scripts]# sed '=' person.txt

1

101,oldboy,CEO

2

102,zhangyao,CTO

3

103,Alex,COO

4

104,yy,CFO

5

105,fcixuc,CIO

#以上的形式不好看,所以改变方式为:

[root@backup scripts]# sed '=' person.txt | sed 'N;s#\n# #g'

1 101,oldboy,CEO

2 102,zhangyao,CTO

3 103,Alex,COO

4 104,yy,CFO

5 105,fcixuc,CIO

[root@backup scripts]# sed '1,2=' person.txt | sed 'N;s#\n# #g'

1 101,oldboy,CEO

2 102,zhangyao,CTO

103,Alex,COO 104,yy,CFO

105,fcixuc,CIO

(4)合并两个文件:

[root@backup scripts]# sed '$r num.txt' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

#在person.txt的第二行后面插入mum.txt的所有内容;

[root@backup scripts]# sed '2r num.txt' person.txt

101,oldboy,CEO

102,zhangyao,CTO

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

103,Alex,COO

104,yy,CFO

105,fcixuc,CIO

(5)一条sed语句执行多条sed命令:

#删除第三行到末尾的内容,并将第一行的oldboy替换成lc;

[root@backup scripts]# sed '3,$d;1s#oldboy#lc#g' person.txt

101,lc,CEO

102,zhangyao,CTO

7、企业案例:

(1)对ssh进行优化:

sed -i '13i Port 52113\nListenAddress 172.16.1.61:52113\nPermitRootLogin no\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/ssh_config

(2)删除某一个字符或查询一个字符串,完全匹配字符串;

[root@backup scripts]# cat a.txt

oldboy

lc

#'/\<oldboy\>/'表示一个文本中单行内只有该字符串,可以匹配多个;/var/ 同样适用于grep;

[root@backup scripts]# sed -i '/\<oldboy\>/d' a.txt

[root@backup scripts]# sed -n '/\<oldboy\>/p' a.txt

(3)修改selinux的值:

sed -i `s#SELINUX=enforcing#SELINUX=disabled#g` /etc/selinux/config

sed -i `7s#enforcing#disabled#g` /etc/selinux/config

(4)批量重命名文件:

[root@backup test]# f=4e5a725a_finished.html

[root@backup test]# mv $f `echo $f | sed 's#_finished.html#.jpg#g'`

[root@backup test]# cat c23.sh

#!/bin/sh

for f in `ls /server/scripts/test/*.html`; do

mv $f `echo $f | sed "s#_finished.html#.jpg#g"`

if [ $? -ne 0 ]; then

echo $f >>/tmp/error.log

fi

done

(5)linux启动选项优化:

[root@backup scripts]# chkconfig --list | grep 3:启用 | egrep -v "sshd|crond|network|rsyslog|sysstat" | awk '{print $1}' | sed -r 's#(.*)#chkconfig \1 off#ge' # |base

#g参数可以不加,表示匹配每一行的第一个字符;

(6)一个文件100行,把5,35,70行拿出来用一条命令;

[root@backup scripts]# sed -n '5p;35p;70p;' /etc/services

# IANA services version: last updated 2009-11-10

qotd 17/tcp quote

whois++ 63/udp

(7)把上行和下行的内容用“=”连接;

[root@backup scripts]# vim svn.txt

stu1\n

1\n

stu2\n

2\n

stu3\n

3\n

stu4\n

4\n

stu5\n

5\n

[root@backup scripts]# sed 'N;s#\n#=#g' svn.txt

stu1=1

stu2=2

stu3=3

stu4=4

stu5=5

猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12313584.html
今日推荐