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

时间:2022-09-06 08:41:40

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

原文:http://blog.51cto.com/hujiangtao/1923718

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

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命令】 【输入文件】

4,命令执行流程

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

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

5,选项说明

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

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

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

6,使用范例

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必须成对出现,表示终止输入

6.2 常用功能-增删改查

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

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 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication 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查。

6.2.2 删

6.2.2.1指定执行的地址范围

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

[root@chensiqi1 ~]# sed 'd' person.txt 下面用具体的例子演示一下,测试文件还是person.txt

[root@chensiqi1 ~]#

命令说明:如果在sed命令前面不指定地址范围,那么默认会匹配所有行,然后使用d命令删除功能就会删除这个文件的所有内容

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

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

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

101,chensiqi,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:这个单行删除想必大家能理解,指定删除第2行的文本102,zhangyang,CTO

[root@chensiqi1 ~]# sed '/zhangyang/d' person.txt

101,chensiqi,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:
在sed软件中,使用正则的格式和awk一样,使用2个”/“包含指定的正则表达式,即“/正则表达式/”

6.2.2.2 特殊符号~(步长)解析

例子:

  • 1~2 匹配1,3,5,7.....#-->用于只输出奇书行,大伙仔细观察一下每个数字的差值。

  • 2~2 匹配2,4,6,8....#-->用于只输出偶数行

  • 1~3 匹配1,4,7,10.....

  • 2~3 匹配2,5,8,11.....

[root@chensiqi1 ~]# seq 10

1

2

3

4

5

6

7

8

9

10

命令说明:seq命令能够生成从1到10的数字序列。

6.2.2.3 特殊符号+解析

[root@chensiqi1 ~]# sed '1,+2d' person.txt

104,yy,CFO

105,feixue,CIO

命令说明:这其实是做个加法运算,‘1,+2d’==>删除第1行到第3(1+2)行的文本。

6.2.2.4 特殊符号!解析

感叹号“!”我们在很多命令里都接触过,大部分都是取反的意思,在sed中也不例外

[root@chensiqi1 ~]# sed '2,3!d' person.txt

102,zhangyang,CTO

103,Alex,COO

命令说明:

在地址范围“2,3”后面加上“!”,如果不加“!”表示删除第2行和第3行,结果如下面的例子所示

然后加上“!”的结果就是除了第2行和第3行以外的内容都删除,这个方法可以作为显示文件的第2,3行题目的补充方法。

[root@chensiqi1 ~]# sed '2,3d' person.txt 101,chensiqi,CEO104,yy,CFO105,feixue,CIO

6.2.3 改

6.2.3.1 按行替换

例子:

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

101,chensiqi,CEO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:使用sed命令c将原来第2行“102,zhangyang,CTO”替换成“106,dandan,CSO”,整行替换

6.2.3.2 文本替换
  • 这里用到的sed命令,选项:
    “s”:单独使用-->将每一行中第一处匹配的字符串进行替换==>sed命令
    “g”:每一行进行全部替换-->sed命令s的替换标志之一(全局替换),非sed命令。
    “-i”:修改文件内容-->sed软件的选项,注意和sed命令i区别。

sed软件替换模型

sed -i 's/目标内容/替换内容/g' chensiqi.log
sed -i 's#目标内容#替换内容#g'

例子:

[root@chensiqi1 ~]# sed 's#zhangyang#dandan#g' person.txt

101,chensiqi,CEO

102,dandan,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:

将需要替换的文本“zhangyang”放在第一个和第二个“#”之间

将替换后的文本“dandan”放在第二个核第三个“#”之间。结果为第二行的“zhangyang”替换为“dandan”

6.2.3.3 变量替换

[root@chensiqi1 ~]# cat >test.txt<<KOF #再新建一个简单的测试文本

> a
> b
> a
> KOF
[root@chensiqi1 ~]# cat test.txt

a
b
a
[root@chensiqi1 ~]# x=a #->设置变量x并 赋值a

[root@chensiqi1 ~]# y=b #-> 设置变量y并赋值b

[root@chensiqi1 ~]# echo $x

a
[root@chensiqi1 ~]# echo $x $y

a b

命令说明:打印变量x,y验证一下,需要使用$符号引用变量

 

6.2.3.4 分组替换()和\1的使用说明

sed软件的()的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二个记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

例:echo "I am chensiqi teacher."如果想保留这一行的单词chensiqi,删除剩下部分,使用圆括号标记想保留的部分

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed 's#^.*am \([a-z]\+\) tea.*$#\1#g'

chensiqi

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#^.*am ([a-z]+) tea.*$#\1#g'

chensiqi

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#I (.*) (.*) teacher.#\1\2#g'

amchensiqi

命令说明:
sed如果不加-r后缀,那么默认不支持扩展正则表达式,需要\符号进行转义

小括号的作用是将括号里的匹配内容进行分组以便在第2和第3个#号之间进行sed的反向引用,\1代表引用第一组,\2代表引用第二组

企业案例4:系统开机启动项优化(利用sed)

[root@chensiqi1 ~]# chkconfig --list | egrep -v  "sshd|crond|rsyslog|sysstat|network" | awk '{print $1}' |sed -r 's#^(.*)#chkconfig \1 off#g' |bash

6.2.4 查

6.2.4.1 按行查询

[root@chensiqi1 ~]# sed '2p' person.txt

101,chensiqi,CEO

102,zhangyang,CTO

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chensiqi1 ~]# sed -n '2,3p' person.txt

102,zhangyang,CTO

103,Alex,COO

命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

6.2.4.2 按字符串查询

[root@chensiqi1 ~]# sed -n '/CTO/p' person.txt

102,zhangyang,CTO

命令说明:打印含CTO的行

[root@chensiqi1 ~]# sed -n '/CTO/,/CFO/p' person.xt

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

命令说明:打印含CTO的行到含CFO的行。

6.2.4.3 过滤多个字符

[root@chensiqi1 ~]# sed -rn '/chensiqi|yy/p' person.txt

101,chensiqi,CEO

104,yy,CFO

命令说明:
使用扩展正则“|”,为了不使用转义符号“\”,因此使用-r选项开启扩展正则表达式模式

7,sed命令应用知识扩展

7.1 sed如何取不连续的行

[root@chensiqi1 ~]# sed -n '1p;3p;5p' person.txt

101,chensiqi,CEO

103,Alex,COO

105,feixue,CIO

7.2 特殊符号{}的使用

[root@chensiqi1 ~]# sed -n '2,4p;=' person.txt

1

102,NB,CTO

2

103,Alex,COO

3

104,yy,CFO

4

5

命令说明:-n去掉默认输出,2,4p,输出2到4行内容,=输出全部的行的行号

[root@chensiqi1 ~]# sed -n '2,4{p;=}' person.txt

102,NB,CTO

2

103,Alex,COO

3

104,yy,CFO

4

命令说明:‘2,4{p;=}’代表统一输出2,4行的行号和内容

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

(转)不看绝对后悔的Linux三剑客之sed实战精讲的更多相关文章

  1. &lpar;转&rpar;不看绝对后悔的Linux三剑客之grep实战精讲

    不看绝对后悔的Linux三剑客之grep实战精讲 原文:http://blog.51cto.com/hujiangtao/1923675 https://www.cnblogs.com/peida/a ...

  2. &lpar;转&rpar;不看绝对后悔的Linux三剑客之awk实战精讲

    原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...

  3. Linux实战教学笔记12&colon;linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  4. day14 linux三剑客之sed命令

    day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...

  5. Linux 三剑客之sed

    目录 Linux 三剑客之sed 命令补充: sort命令 uniq命令 cut命令 tr命令 wc命令 三剑客 - sed 编辑模式: 定位分类: 实例如下: d模式--删除模式 p模式--打印 a ...

  6. Linux 三剑客之 awk 实战详解教程

    我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...

  7. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  8. linux三剑客之sed命令

    一.前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等.如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令.但是这些命令 ...

  9. Linux三剑客grep&sol;sed&sol;awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

随机推荐

  1. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  2. eclipse上修改js后,浏览器上还是出现原来效果的解决方法

    废话不多说,直接上方法: 1.最简单的是清除浏览器缓存.2.换个浏览器试试.3.修改js文件名,换成别的名称,再引用.4.重启eclipse.5.重启电脑.

  3. kali linux 、 windows、ubuntu三系统的引导问题

    '小飞机'是一个学生,所以接触的东西,虽广泛,但并不精通,在此利用随笔,记录自己的一些学习过程,以及自己的想法,既可以有时间自己复习,也可以顺便帮助别人. 近期由于同学的引诱以及男生天生对于破解的好奇 ...

  4. &lbrack;Jsp&rsqb;防止页面表单重复提交的解决方法

    个人学习笔记,写下方便以后复用. 当我们写了个注册页面时候,用户完成注册并提交,用户注册的资料并录入数据库保存,最不希望出现的是在一个会话中出现多次提交的结果,我们可以通过为请求设置标记来避免此类事件 ...

  5. 解决 DCEF3 在 BeforePopup 事件中打开新窗体的问题

    此问题的解决方案从 https://groups.google.com/forum/#!topic/delphichromiumembedded/xzshOr-pjnU 获得. procedure T ...

  6. JMeter怎么在get URL请求、POST请求中添加动态参数用于服务器段安全验证

    从前一个页面(含有服务器段返回给客户端的参数,用于在下一次请求时验证)中添加后置处理器中的Regular Expression Extractor,使用正则表达式对参数进行提取. 在用到这些变量时可以 ...

  7. 转化成maven dependencis

    右键工程--->configure--->convert to maven project

  8. 行为驱动:Cucumber &plus; Selenium &plus; Java&lpar;四&rpar; - 实现测试用例的参数化

    在上一篇中,我们介绍了Selenium + Cucumber + Java框架下的使用Tags对测试用例分组的实现方法,这一篇我们用数据表格来实现测试用例参数化. 4.1 什么是用例参数化 实际测试中 ...

  9. 用微信小程序连接leancloud数据库注意事项~

    具体步骤转载如下: 官网教程 大佬提示 注意事项: 1.下载的av-weapp-min.js,需要放在当前项目名称的子目录pages下 2.如上述教程,需要注册leancloud和AppID,并写在a ...

  10. CrawlSpiders模块的使用

    创建文件模板 scrapy genspider -t crawl tencent tencent.com CrawlSpiders就是为爬取整站孕育而生的,我们以前是分页下一页,然后再yied.这样太 ...