4.2 sed:流编辑器

4.2.1 sed命令语法及参数说明

【命令星级】 ★★★★★

【功能说明】

​ sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。它是Linux三剑客之一。

​ sed是操作、过滤和转换文本内容的强大工具。sed的常用功能包含对文件实现快速增删改查(增加、删除、修改、查询),其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)和取行(取出指定的行)。

【语法格式】

sed [选项] [sed内置命令字符] [输入文件]

说明:

​ 1)为了避免混淆,本文称呼sed为sed或sed命令,将实现不同sed功能的内部命令参数,称为“sed内置命令字符”,以区别是sed命令还是sed内置命令选项。

​ 2)“sed内置命令字符”既可以是单个命令,也可以是多个命令参数的组合。

​ 3)“输入文件”为sed需要处理的文件,是可选项,sed还能从标准输入(如管道)获取输入。

【选项说明】

​ 表4-2针对sed命令的参数选项进行了说明。

​ 表4-2 sed常用参数选项

sed内置命令字符可用来实现对文件的不同操作功能,例如对文件的增删改查等,表4-3为sed的内置命令字符说明。

​ 表4-3 sed的常用内置命令字符功能说明

4.2.2 使用范例

4.2.2.1 基础范例

​ 为了更好地测试sed命令的用法,准备测试的内容及文件如下:

[root@centos7 ~]# cat >persons.txt<<EOF
> 101,netealge,CEO
> 102,zhangyao,CTO
> 103,Alex,COO
> 104,yy,CFO
> 105,feixue,CIO
> EOF    #这里要敲回车才能结束,另外,EOF必须成对出现,但也可以用别的成对标签来替换。例如:neteagle字符标签。

​ **范例4-10:**在文件指定行后追加文本。

[root@centos7 ~]# sed '2a 106,dandan,CSO' persons.txt     #这里使用了sed内置命令a追加功能。
101,netealge,CEO
102,zhangyao,CTO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令详细说明:

​ 首先我们来看一下命令执行后的结果,可以看到在第二行"102,zhangyao,CTO"后面追加了一行新的文本“106,dandan,CSO”。

​ 接下来我们解读一下该sed命令语句的结构,sed开头,然后接上空格,这里要郑重地和大家说一点,在练习Linux命令时一定不要忘了空格(空格个数不限,但至少要有一个!),Linux命令和各个参数之间都需要以空格作为分隔符,否则命令会无法执行。

​ 在空格后面,我们先输入一对单引号(‘’),然后再退一格在单引号中输入sed的内置命令字符,先把2个引号输入完了再在里面填写内容,这也是一格良好的习惯,因为很多人在输入内容的时候把后面的引号忘了,最后命令执行失败还不知道哪里错了,因此我们要养成良好的习惯,以避免没有意义的错误。

​ 接下来所讲的是重点了,新手们,一定要记好!

  • sed后面单引号中的内容为:2a 106,dandan,CSO。

  • 2表示对第2行进行操作,其他的行忽略。

  • a表示追加,2a即在第2行后追加文本。

  • 2a后面加上空格,然后接着输入想要追加的文本内容(106,dandan,CSO)即可。

    ​ **范例4-11:**在文件指定的行前加入文本。

    [root@centos7 ~]# sed '2i 106,dandan,CSO' persons.txt  #这里使用了sed内置命令i插入功能。
    101,netealge,CEO
    106,dandan,CSO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

命令详细说明:

​ 首先我们来看一下上述命令的执行结果,可以看到命令执行后在原来的第二行"102,zhangyao,CTO"前面插入了新的一行为“106,dandan,CSO”,原来的第2行变成了第3行了。

​ 接下来我们解读一下该sed命令语句的结构,以sed开头,然后接上空格,在空格后面,是一对单引号(‘’),然后再单引号中的内容是“2i 106,dandan,CSO”。

  • 2表示对第2行进行操作,其他的行可忽略。

  • i代表插入的意思,2i表示在第2行即当前行插入文本,即插入到第二行。

  • 2i后面加上空格,然后跟上要插入的文本(106,dandan,CSO),最后接上要处理的文件persons.txt。

    ​ **范例4-12:**在文件指定行后追加多行文本。

    [root@centos7 ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' persons.txt
    101,netealge,CEO
    102,zhangyao,CTO
    106,dandan,CSO
    107,bingbing,CCO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

    命令详细说明:

    ​ 首先我们粗略看一下该命令语句,可以发现命令结构与单行增加文本几乎是没有区别的。

    ​ 然后我们看一下命令的结果,可以看到原来的第二行“102,zhangyao,CTO”后面追加了2行文本“106,dandan,CSO”和“107,bingbing,CCO”。

    ​ 接下来我们解读一下该sed命令语句的结构,sed软件大头,然后接上空格,在空格后面,我们先输入一对单引号(‘’),然后退一格在单引号中的内容是’2a 106,dandan,CSO\n107,bingbing,CCO’。

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

  • a代表追加的意思,2a即在第2行后追加文本。

  • 2a后面加上空格,然后输入想要插入的多行文本即可。这里的每行文本都使用“\n”连接就可以写成一行了。最后输入想要处理的文件persons.txt

​ 同理,在文件指定行前插入多行文本只需要将本例的sed内置命令a换成i就可以了。

​ **范例4-13:**删除文件中一行指定的文本。

[root@centos7 ~]# sed '2d' persons.txt    #这里使用了sed内置命令d实现删除功能,指定删除第2行的文本。
101,netealge,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

​ **范例4-14:**删除文件中指定的多行文本。

[root@centos7 ~]# sed '2,5d' persons.txt  #“2,5”是一个数字地址的组合,用逗号作为分隔,其作用是删除文件的第二行到第五行(删除多行)文本,包括第2行和第5行,因此只剩下第1行。
101,netealge,CEO

​ **范例4-15:**使用sed命令替换文本内容。

[root@centos7 ~]# sed 's#zhangyao#dandan#g' persons.txt   #这里使用了sed内置命令s来实现替换功能,并且使用了全局替换标志g表示替换文件中匹配zhangyao的所有字符串。需要注意一下语法格式,将需要替换的文本“zhangyao”放在第一个和第二个“#”之间,将替换后的文本“dandan”放在第二个和第三个“#”之间。结果为第二行的“zhangyao”替换为“dandan”。
101,netealge,CEO
102,dandan,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

​ **范例4-16:**打印输出文件的指定行的内容。

[root@centos7 ~]# sed '2p' persons.txt    #这里使用了sed内置命令p实现查询功能,并结合数字地址指定查询第2行的内容,但是我们会发现结果不只是输出第2行,文件的其他内容也显示出来了,这是因为sed命令有一个默认输出的功能。
101,netealge,CEO    #默认输出的行。
102,zhangyao,CTO    #p命令输出的行。
102,zhangyao,CTO    #默认输出的行。
103,Alex,COO    #默认输出的行。
104,yy,CFO  #默认输出的行。
105,feixue,CIO  #默认输出的行。
[root@centos7 ~]# sed -n '2p' persons.txt    #为了解决上面命令显示多余内容的问题,使用选项-n取消默认输出,只输出匹配行的文本,因此大家只需要记住使用命令p必用选项-n。
102,zhangyao,CTO
[root@centos7 ~]# sed -n '2,3p' persons.txt  #当然使用地址范围“2,3”能够查看第2行到第3行的内容。
102,zhangyao,CTO
103,Alex,COO

4.2.2.2 生产案例

​ **范例4-17:**优化SSH配置(在SSH服务的配置文件中增加多行参数)。

​ 在学习CentOS系统的优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config中加入下面5行文本。

Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GssAPIAuthentication no

​ 当然我们可以使用vi/vim命令编辑这个文本,但这样会比较麻烦,现在想用一条命令增加上述5行文本到第13行前。

​ **注意:**修改前别忘了备份配置文件:cp /etc/ssh/sshd_config{,.ori}。

[root@centos7 ~]# sed -i.bak '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGssAPIAuthentication no' /etc/ssh/sshd_config   #这道题用到了范例4-3的方法,将插入的5行内容使用“\n”就可以变成一行了。题目要求在第13行前面插入,因此这里使用sed内置命令i。i后面接字符,表示备份文件后再处理,例如:-i.bak,是先把/etc/ssh/sshd_config文件备份为/etc/ssh/sshd_config.bak后,再处理文件。

​ 上面执行的命令出现了一个新的选项“-i”,这个选项的作用是能够实际修改文件的内容,可能读者也发现了前面几个例子操作完命令之后,文件的内容并没有发生变化,这是因为sed命令默认操作的是内存中的数据,如果想要真正地修改文件的内容,就需要使用选项“ -i”将修改写到磁盘文件上。

[root@centos7 ~]# sed -n '13,17p' /etc/ssh/sshd_config        #查看文件的第13行到第17行,确认修改成功。
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GssAPIAuthentication no[root@centos7 ~]# rm -f /etc/ssh/sshd_config
[root@centos7 ~]# mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config

​ **范例4-18:**通过Shell脚本生成的账号密码如下所示。

[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8    #生成8位随机数。
BhmksfZA[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
jP2sJu5s[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
APE6F0e6[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
ziYCdEBq[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
5hHUFlQ8[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
LfP8L5fa[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
Pqk8nA89[root@centos7 ~]# cat >test.txt<<EOF  #创建测试文件。
> stu10309
> BhmksfZA
> stu10312
> jP2sJu5s
> stu10315
> APE6F0e6
> stu10318
> ziYCdEBq
> sut10321
> 5hHUFlQ8
> stu10324
> LfP8L5fa
> stu10327
> Pqk8nA89
> EOF
[root@centos7 ~]# cat test.txt
stu10309    #账号。
BhmksfZA    #密码。
stu10312
jP2sJu5s
stu10315
APE6F0e6
stu10318
ziYCdEBq
sut10321
5hHUFlQ8
stu10324
LfP8L5fa
stu10327
Pqk8nA89

​ 现在要求使用命令将上面的文本转换成下面SVN服务配置文件中的账号及密码格式。

stu10309=BhmksfZA   #格式“账号=密码”。
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89

​ **提示:**实现的思路就是将奇数行和偶数行用“=”(等号)连接成一行。

​ 解答:此题利用了sed的特殊功能应用。

[root@centos7 ~]# sed 'N;s#\n#=#g' test.txt
stu10309=BhmksfZA
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89

命令详细说明:

​ sed内置命令N的作用:不会清空模式空间内容,并且从输入文件中读取下一行数据,追加到模式空间中,两行数据以换行符\n连接。

​ 第一行是“stu10309”存入模式空间,碰到命令“N”,读取第二行“BhmksfZA”,此时模式空间内容为“stu10309\nBhmksfZA”;然后执行“s#\n#=#g”将“\n”替换为“=”,即为“stu10309=BhmksfZA”,输出到平面上,第一个循环结束;后面的循环和前面的思路一样,直到文件结束,更多细节请参考本书sed命令部分。

L29.linux命令每日一练 -- 第四章 文本处理三剑客 -- sed命令相关推荐

  1. L84.linux命令每日一练 -- 第11章 Linux系统管理命令 -- rpm和yum

    11.19 rpm:RPM包管理器 11.19.1 命令详解 ​ [命令星级] ★★★★★ ​ [功能说明] ​ rpm命令的全称是Red Hat Package Manager(Red Hat包管理 ...

  2. L46.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- w和who

    7.13 w:显示已登录用户信息 7.13.1 命令详解 ​ [命令星级] ★★★★★ ​ [功能说明] ​ w命令可以显示已经登录系统的用户,并显示用户正在执行的命令. ​ [语法格式] w [op ...

  3. L39.linux命令每日一练 -- 第六章 文件备份与压缩命令 -- scp和rsync

    6.5 scp:远程文件复制 6.5.1 命令详解 ​ [命令星级] ★★★★★ ​ [功能说明] ​ scp命令用于在不同的主机之间复制文件,它采用SSH协议来保证复制的安全性.scp命令每次都是全 ...

  4. L32.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- dmesg和stat

    5.3 dmesg:系统启动异常诊断 5.3.1 命令详解 ​ [命令星级] ★★★☆☆ ​ [功能说明] ​ dmesg用于显示内核环形缓冲区(kernel-ring buffer)的内容.在进行系 ...

  5. L38.linux命令每日一练 -- 第六章 文件备份与压缩命令 -- zip和unzip

    6.3 zip:打包和压缩文件 6.3.1 命令详解 ​ [命令星级] ★★★★☆ ​ [功能说明] ​ zip压缩格式是Windows与Linux等多平台通用的压缩格式.和gzip命令相比,zip命 ...

  6. L23.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- iconv和dos2unix命令

    3.15 iconv:转换文件的编码格式 3.15.1 命令详解 ​ [命令星级] ★★★☆☆ ​ [功能说明] ​ iconv命令用于转换文件的编码格式. ​ [语法格式] iconv [optio ...

  7. L48.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- last、lastb和lastlog

    7.17 last:显示用户登录列表 7.17.1 命令详解 ​ [命令星级] ★★★★★ ​ [功能说明] ​ last命令能够从日志文件/var/log/wtmp读取信息并显示用户最近的登录列表. ...

  8. L24.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- diff和vimdiff命令

    3.17 diff:比较两个文件的不同 3.17.1 命令详解 ​ [命令星级] ★★★★☆ ​ [功能说明] ​ diff命令可以逐行比较纯文本文件的内容,并输出文件的差异. ​ [语法格式] di ...

  9. linux教程 sed命令的用法,Linux文本处理三剑客——sed命令使用教程

    SED是一种流编辑器工具,可以根据设置的匹配条件对文件内容进行处理,支持正则表达式.sed每次处理一行数据,和awk处理流程是一样的. sed命令格式: sed [options] '/pattern ...

最新文章

  1. 如何高效的利用博客园?
  2. selenium-05-常见问题
  3. python开发转行做数据分析_转行学IT,Java、Python、大数据选择学哪个发展好?
  4. 2020重学Go系列:反引号的妙用—结构体里的 Tag 标签
  5. 电脑网络怎么添加计算机,Win10系统如何添加网络共享打印机
  6. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
  7. CSting的GetBuffer()和ReleaseBuffer()
  8. JPanle组件按钮 表格布局
  9. 微信小程序 云函数 Date时间不对+8小时 设置北京时间
  10. 前端基础 IE浏览器渲染-重置浏览器默认样式
  11. Latex 箭头、下标、符号上下写文字、正方形和三角形
  12. OSPF多区域中必须有area0。非area0区域要与area0相连才能实现传播域间路由信息
  13. IMDB排名前250名的电影,你看过几部?
  14. 如何才能做好短线交易?这三点你要知道!
  15. Python正态云发生器
  16. 对Redis中主从复制、哨兵模式和集群进行部署
  17. 从刚体动力学方程到 MATLAB 多种方法仿真验证
  18. Android MTK 放电曲线以及库轮值矫正
  19. 网络故障诊断的原则[转自www.cnitblog.com/wildon]
  20. 【shell 脚本编程】一键搭建 LAMP,Web 应用程序平台,你值得拥有

热门文章

  1. IDEA使用小技巧_ 设置 项目包名分级、层级显示、IDEA常用的快捷键
  2. Linux 安装TensorRT、Pycuda
  3. 每日一题 leetcode 997. 找到小镇的法官 java
  4. 修改Maven本地仓库的路径
  5. 作业帮为何高价收购域名zuoyebang.com?
  6. 无线路由器文件服务器,无线路由器加USB硬盘组建属于自己的FTP服务器的方法
  7. 神武手游创建人物等待服务器响应,神武2手游成长全流程变强必经之路 人物增强篇...
  8. 《影响你的几大独特数字》转至占星同盟
  9. cmd命令操作MySQL数据库
  10. debian软件包管理