第1章 sed基础

第1章 sed知识点

不看绝对后悔的Linux三剑客之sed实战精讲

原文:

1.1 sed的选项  stream editor 流编辑器

 -r              支持扩展正则

 -n              取消默认输出

 -i               直接修改不输出到桌面

 -i.bak        备份

1.1 sed是什么

二、Linux三剑客之sed命令精讲

 

1.2 sed的书写格式

sed    ‘条件命令’

sed      ‘pattern命令’

sed      ‘模式命令’

字符流编辑器 Stream Editor

1,前言

  • 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等。如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令。但是这些命令效率不高,这就好比一块空地准备搭建房子,请了10个师傅拿着铁锹挖地基,花了一个月的时间才挖完,而另外一块空地则请了个挖土机,三下五除二就搞定了,这就是效率。而在linux中的“挖土机”有三种型号:顶配awk,中配sed,标配grep。使用这些工具,我们能够在达到同样效果的前提下节省大量的重复性工作,提高效率。

  • 接下来我们就看一下sed的详细说明

  • sed 是Stream
    Editor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家可以想象以下流水线,sed就像一个车间一样,文件中的每行字符都是原料,运到sed车间,然后经过一系列的加工处理,最后从流水线下来就变成货物了。

2,软件功能与版本

  • Sed命令是操作,过滤和转换文本内容的强大工具。常用功能有增删改查(增加,删除,修改,查询),其中查询的功能中最常用的2大功能是过滤(过滤指定字符串),取行(取出指定行)。

  • 我们现在准备学习的sed版本是GNU开源版本的,我的实验环境是CentOS6.8系统,内核版本是2.6.32-642.el6.x86_64

3,语法格式

sed [options] [sed -commands][input -file]
sed [选项]  【sed命令】 【输入文件】

1.3 sed命令执行过程

1.读取文件内容第1行

2.是否满足条件

     1).满足条件 执行对应的命令 p  s  d 

     2).不满足   继续第1步

3.截止到文件的最后一行

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

4,命令执行流程

文件person.txt在模式空间的完整处理流程

1,判断第1行是否是需要处理的行,如果不是要处理的行就重新从文件读取下一行,如果是要处理的行,则接着往下走。
2,对模式空间的内容执行sed命令,比如a(追加),i(插入),s(替换)…
3,将模式空间中经过sed命令处理后的内容输出到屏幕上,然后清空模式空间
4,读取下一行文本,然后重新执行上面的流程,直到文件结束

第2章 sed命令的使用

sed增删改查   不加i选项只会把修改内容输出到并没有真正修改,加上i选项会直接修改文件内容

1.2 sed功能与版本

1)处理纯文本文件,日志,配置文件等==>Linux

2)增加、删除、修改、查询

3)sed
–version

[root@oldboyedu43 ~]# sed –version

GNU sed version 4.2.1

Copyright (C) 2009 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,

to the extent permitted by law.

 

GNU sed home page: <http://www.gnu.org/software/sed/>.

General help using GNU software: <http://www.gnu.org/gethelp/>.

E-mail bug reports to: <bug-gnu-utils@gnu.org>.

Be sure to include the word “sed” somewhere in the “Subject:” field.

1.3 语法格式

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

sed -i.bak
‘s#oldboy#oldgirl#g’ oldboy.txt

-i
 —-sed命令的参数

s —sed指令

g
—小尾巴/修饰

5,选项说明

option[选项] 解释说明(带*的为重点)
-n 取消默认的sed软件的输出,常与sed命令的p连用。*
-e 一行命令语句可以执行多条sed命令
-f 选项后面可以接sed脚本的文件名
-r 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
-i 直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件*

图片 1

图片 2

2.1 sed 增加  cai

c   replace 替换

a   append 追加

i   insert 插入

1.4 sed 命令运行过程

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern
space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

6,使用范例

2.1.1 在person.txt文件第三行下追加12306,xiao,UFO

查看person.txt文件

[root@zeq lx]# cat person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

第三行下追加12306,xiao,UFO

[root@zeq lx]# sed '3a12306,xiao,UFO' person.txt      a追加,3a在第三行下追加

101,zeq,CEO

102,zhang,CTO

103,Love,COO

12306,xiao,UFO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

第2章 查询 p(print)

6.1 统一实验文本

[root@chensiqi1 ~]# cat >person.txt<<KOF

>
101,chensiqi,CEO

> 102,zhangyang,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> KOF        
 #KOF必须成对出现,表示终止输入

 

2.1.2 在person.txt文件第三行上插入12306,xiao,UFO

[root@zeq lx]# sed '3i12306,xiao,UFO' person.txt

101,zeq,CEO

102,zhang,CTO

12306,xiao,UFO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

2.1 按行查询

6.2 常用功能-增删改查

2.1.3 把person.txt文件第三行替换成12306,xiao,UFO

[root@zeq lx]# sed '3c12306,xiao,UFO' person.txt

101,zeq,CEO

102,zhang,CTO

12306,xiao,UFO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

2.1.1 单行

1.   p 打印模式空间的内容

2.   -n 取消默认的sed软件的输出

创建环境

[root@oldboyedu43 ~]# cd /oldboy/

[root@oldboyedu43 oldboy]# touch person.txt

[root@oldboyedu43 oldboy]# cat >>person.txt<<EOF

> 101,oldboy,CEO

> 102,zhangyao,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> EOF

1: 取具体的某一行   sed -n ‘3p’ person.txt

[root@oldboyedu43 oldboy]# sed -n ‘3p’ person.txt

103,Alex,COO

2. 显示文件的最后一行  sed -n ‘$p’
person.txt

[root@oldboyedu43 oldboy]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO                                                                                                      

[root@oldboyedu43 oldboy]# sed -n ‘$p’ person.txt

105,feixue,CIO  

3. 取包含xxx的行

[root@oldboyedu43 oldboy]# sed -n ‘/oldboy/p’ person.txt 

101,oldboy,CEO

6.2.1 增

  • 这里我们需要用到2个sed命令,分别是:
    “a”:追加文本到指定行后,记忆方法:a的全拼是apend,意思是追加。
    “i“:插入文本到指定行前,记忆方法:i的全拼是insert,意思是插入。
6.2.1.1 单行增

[root@chensiqi1 ~]# sed ‘2a 106,dandan,CSO’
person.txt

101,chensiqi,CEO

102,zhangyang,CTO106,dandan,CSO   #这就是新增那句

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令行详解:

  • 2代表指定对第2行操作,其他的行忽略

  • i代表插入的意思,2i即在第2行前插入文本

  • 2i后面加上空格,然后跟上你想要插入的文本即可

最后接上你想要处理的文件person.txt

2.1.4 在文件最后一行增加

12306,xiao,UFO

12580,tao,XO

[root@zeq lx]# sed  '$a12306,xiao,UFOn12580,tao,XO' person.txt    $最后一行   n回车

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

12306,xiao,UFO

12580,tao,XO

2.1.2 多行

1. 连续的多行-地址范围精讲  连续的行使用 , 号

没有地址,默认匹配所有行

sed -n ‘从哪里来,哪里去p’

  数字 :sed -n ‘1,3p’ person.txt

[root@oldboyedu43 oldboy]# sed -n ‘1,3p’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

 2. 正则地址范围-模糊,容易找多了

 正则 :sed -n ‘/oldboy/p’ person.txt

          sed -n ‘/oldboy/,/yy/p’
person.txt

[root@oldboyedu43 oldboy]# sed -n ‘/oldboy/p’ person.txt

101,oldboy,CEO

[root@oldboyedu43 oldboy]# sed -n ‘/o.*y/p’ person.txt 

101,oldboy,CEO

[root@oldboyedu43 oldboy]##显示包含oldboy的行到包含yy的行

[root@oldboyedu43 oldboy]# sed -n ‘/oldboy/,/yy/p’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

3. 不连续的多行 使用 ; 号隔开(使用分号)

[root@oldboyedu43 oldboy]# #同一行放多个命令用;

[root@oldboyedu43 oldboy]# sed -n ‘1p;4p;5p’ person.txt 

101,oldboy,CEO

104,yy,CFO

105,feixue,CIO

6.2.1.2 引号的区别总结
  1. 双引号:把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为`命令或变量`或$(命令或变量)

  2. 单引号:所见即所得,将单引号内的内容原样输出,阻止所有字符的转义

  3. 不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。

  4. 倒引号(反引号Esc键下方):进行命令的替换,在倒引号内部的shell命令将会被执行,其结果输出代替用倒引号括起来的文本。

     

Sed为何用单引号?

[root@chensiqi1 ~]# cat person.txt

101,chensiqi,CEO

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO [root@chensiqi1 ~]# sed ‘2i $PATH’ person.txt
 #单引号–文本内容原封不动插入

101,chensiqi,CEO $PATH

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@chensiqi1 ~]# sed 2i $PATH
person.txt  
#不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行sed:
-e expression #1, char 2: expected after
`a’, `c’ or `i’

[root@chensiqi1 ~]# sed “2i $PATH”
person.txt #双引号–变量$PATH被解析以后在当作文本进行插入

101,chensiqi,CEO /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,zhangyang,CTO 103,Alex,COO 104,yy,CFO
105,feixue,CIO

 

企业案例1:优化SSH配置(一键完成增加若干参数

在我们学习CentOS6系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。(下面参数的具体含义见其他课程。)

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

 

这道企业面试题可以用我们学过的sed命令多行追加功能就可以搞定。

[root@chensiqi1 ~]# sed -i ’13i Port
52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS
nonGSSAPIAuthentication no’ /etc/ssh/sshd_config

 

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“n”就可以变成一行了。
上面还有一个没讲过的选项”-i”,这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。

 

[root@chensiqi1 ~]# sed -n ‘13,17p’
/etc/ssh/sshd_config

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

命令说明:查看增加的文本内容,选项-n与命令p的具体用法见后文的6.2.4查。

 

2.2 sed 删除 d   

2.1.3 过滤多个字符

-r
支持扩展正则表达式

|
扩展正则,同时过滤多个字符

[root@oldboyedu43 oldboy]# sed -nr ‘/oldboy|yy/p’ person.txt 

101,oldboy,CEO

104,yy,CFO sed里面的正则字符左右必须有“/”

6.2.2 删

发表评论

电子邮件地址不会被公开。 必填项已用*标注