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

第1章 sed基础

第1章 sed知识点

不占星对后悔的Linux三刺客之sed实战精讲

原文:

1.1 sed介绍

  1. sed——流编辑器(stream editor)

  2. sed作用与版本:

    管理公事文件,日志,配置文件

    增加、删除、修改、查询

    sed --version

3. 语法格式:sed [选项] [sed指令] [输入文件]

    sed -i.bak 's#boy#girl#g' oldboy.txt

     -i     sed命令的参数

      s     sed命令

      g     小尾巴/修饰

1.1 sed的选项  stream editor 流编辑器

 -r              扶持增加正则

 -n              撤废暗中同意输出

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

 -i.bak        备份

1.1 sed是什么

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

 

1.2 sed命令功能示例

1. 等号’=‘显示行号

        # sed = person.txt

2. 单行-输入行号就能够

        # sed -n '3p' person.txt

        103,Alex,COO

3. 浮现多行

        # sed -n '3,6p' person.txt

4. 包含oldboy的行

        # sed -n '/oldboy/p' person.txt

        101,oldboy,CEO

5. 出示富含oldboy到展现yy的行

        # sed -n '/oldboy/,/yy/p' person.txt

        101,oldboy,CEO

        102,zhangyao,CTO

        103,Alex,COO

        104,yy,CFO

6. 显得包括oldboy或yy的行

        # sed -nr '/oldboy|yy/p' person.txt

7. 显示不总是的行

        # sed -nr '1p;3p;4p' person.txt

8. 文件的最后一行增加两行

        # sed '$a106,wuxingge,UFOn107,lee,XO' person.txt

        #a==append 追加

        #i==insert 插入

        # echo -e '106,wuxingge,UFOn107,lee,XO'>>person.txt

        # cat >>person.txt <<EOF

        > 106,wuxingge,UFO

        > 107,lee,XO

        >EOF

9. 不出示空行方法 !表示取反

        # sed  '/^$/d' person.txt

        # sed -n '/^$/!p' person.txt

        # awk '!/^$/' person.txt

        # grep -v '^$' person.txt

10.    ‘s###’表示逐行替换相符条件的率先个对象

        # sed 's#1#dou#' person.txt

        dou01,oldboy,CEO

        -i 表示分明修改

        -i.bak 表示先备份再修改

        sed中双引号内变量能够进行

11. sed发令中&符号表示前边正则相配到的内容

        # echo '123456'|sed 's#.*#<&>#g'

        <123456>

        # echo '123456'|sed -r 's#([0-9])#<1>#g'

        <1><2><3><4><5><6>

        # echo '123456'|sed 's#.#<&>#g'

        <1><2><3><4><5><6>

1.2 sed的书写格式

sed    '条件命令'

sed      'pattern命令'

sed      '方式命令'

字符流编辑器 Stream Editor

1,前言

  • 我们都晓得,在Linux中漫天皆文件,举例配置文件,日志文件,运转文件等等。假如大家相对这一个文件进行部分编辑查询等操作时,大家大概会想到一些vi,vim,cat,more等一声令下。不过这么些命令功用不高,那就好比一块空地谋算搭建房屋,请了12个师傅拿着铁锹挖地基,花了一个月的年月才挖完,而另外一块空地则请了个挖土机,三下五除二就化解了,那正是成效。而在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 批量改换文件名

    1. 使用sed替换

        # ls *.jpg|sed -r 's#(.*)jpg#mv & 1avi#g'

        mv oldboy01.jpg oldboy01.avi

        mv oldboy02.jpg oldboy02.avi

        # ls *.jpg|sed -r 's#(.*)jpg#mv & 1avi#g'|bash

    2. 施用rename方法批量修改文件名

        # rename jpg avi old*.jpg

        rename      from            to                      file

                替换的内容        替换成什么              替换哪些文件

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,读取下一行文本,然后重新实施上边的流水生产线,直到文件停止

1.4 使用sed命令常见的坑

1. -r与-i同一时间接选举取:

      -r参数在前头:-ri    日常结果

      -i参数在眼下:-ir    表示先把公文备份xxr,然后再交替文件中的内容

2.  -r与-n同期利用:会把源文件的从头到尾的经过清空,只显示适合条件内容

第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

1.5 sed命令计算图

图片 3

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”:追Gavin本到钦赐行后,纪念方法: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 删

2.2.1 删除第2行到第5行

[root@zeq lx]# sed '2,5d' person.txt

101,zeq,CEO

110,ahao,COCO

第3章 增加

6.2.2.1内定试行的地方范围

[root@chensiqi1 ~]# sed 'd' person.txt 下边用实际的事例演示一下,测试文件恐怕person.txt

[root@chensiqi1 ~]#

指令表明:如若在sed命令前面不钦定地点范围,那么私下认可会合营全数行,然后使用d命令删除功效就能去除那些文件的装有内容

 

[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的数字种类。

 

2.2.2 删除从yy开始的行到文件结尾的内容

[root@zeq lx]# sed   '/yy/,$d' person.txt             $文件结尾

101,zeq,CEO

102,zhang,CTO

103,Love,COO

3.1 单行扩展

a 追加append,在钦点行后增多一行或多行文本

i 插入insert,在内定行前拉长一行或多行文本

[root@oldboyedu43 oldboy]# sed '$a 106,wuxingge,UFO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

[root@oldboyedu43 oldboy]# sed '2i 106,wuxingge,UFOn107,lee,XO' person.txt

101,oldboy,CEO

106,wuxingge,UFO

107,lee,XO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

6.2.2.3 特殊符号 分析

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

104,yy,CFO

105,feixue,CIO

指令表达:那实际是做个加法运算,‘1, 2d’==>删除第1行到第3(1 2)行的公文。

 

2.2.3 删除包蕴ahao的行

[root@zeq lx]# sed '/ahao/d' person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

3.2 多行扩展

换行符 n

[root@oldboyedu43 oldboy]# sed '$a 106,wuxingge,UFOn107,lee,XO' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

107,lee,XO

注:cat 命令多行追加

  echo只能在追加到文件末尾  echo >>

  vim 能够写入

6.2.2.4 特殊符号!解析

感叹号“!”大家在众多下令里都接触过,大部分都是取反的情趣,在sed中也不例外

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

102,zhangyang,CTO

103,Alex,高管 命令表明:

在地方范围“2,3”前面加上“!”,假使不加“!”表示删除第2行和第3行,结果如上边包车型大巴例子所示

接下来加上“!”的结果就是除了第2行和第3行以外的内容都剔除,那么些法子可以作为彰显文件的第2,3行难题的补偿方法。

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

 

2.2.4 删除不带有ahao的行

[root@zeq lx]# sed '/ahao/!d' person.txt             !取反,排除

110,ahao,COCO

第4章 删除

6.2.3 改

2.3 sed 替换 's###g'

4.1 单行删除

  d删除 delete

  $ 代表文件的末梢一行

  '1d'  或 '/oldboy/d'

[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 '/oldboy/d' person.txt 

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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”,整行替换

2.3.1 替换掉全数的数字

[root@zeq lx]# sed 's#[0-9]##g'  person.txt

,zeq,CEO

,zhang,CTO

,Love,COO

,yy,CFO

,faker,CIO

,ahao,COCO

4.2 多行删除

[root@oldboyedu43 oldboy]# sed '1,4d' person.txt 

105,feixue,CIO

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”

 

2.3.2 替换掉每行中的第二个数字

[root@zeq lx]# sed 's#[0-9]##'  person.txt       sed 's#[0-9]##' 不加g,默认是匹配到每行第一个数字       sed 's#[0-9]##2' 匹配每行第二个数字

01,zeq,CEO

02,zhang,CTO

03,Love,COO

04,yy,CFO

05,faker,CIO

10,ahao,COCO

4.3 供销合作社案例:不展现文件中的空行

1. sed '/^$/d' person.txt

[root@oldboyedu43 oldboy]# sed -r '/^$/d' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2. grep -v '^$' person.txt

[root@oldboyedu43 oldboy]# grep -v '^$' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3. awk '!/^$/' person.txt

[root@oldboyedu43 oldboy]# awk '!/^$/' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

4. sed -n '/^$/!p' person.txt

[root@oldboyedu43 oldboy]# sed -n '/^$/!p' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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验证一下,必要采纳$符号引用变量

 

2.3.3 后向引用  抽出ip地址

[root@zeq ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*)  Bc.*#1#gp'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'[ :] '   'NR==2{print $4}'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'addr:|  Bc'   'NR==2{print $2}'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'[^0-9.] '   'NR==2{print $2}'

10.0.0.200

第5章 替换

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.#12#g'

amchensiqi 命令表达: sed即使不加-r后缀,那么默许不扶持扩张正则表明式,须要标志进行转义

小括号的遵守是将括号里的特别内容张开分组以便在第2和第4个#号之间张开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

 

2.4 sed  查

5.1 文本替换

6.2.4 查

2.4.1 显示文件的第5行

[root@zeq ~]# sed -n 5p person.txt

105,faker,CIO

5.1.1 sed -i 's#a#b#g' oldboy.log

  s   单独使用——>将每一行中率先个十二分的字符串举办替换

[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 's#[0-9]#oldboy#' person.txt 

oldboy01,oldboy,CEO

oldboy02,zhangyao,CTO

oldboy03,Alex,COO

oldboy04,yy,CFO

oldboy05,feixue,CIO

   g   global 每一行进行任何交替——>sed指令s的交替标识之一(全局替换)

[root@oldboyedu43 oldboy]# sed 's#[1-9]#AA#g' person.txt

AA0AA,oldboy,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

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,亚历克斯,首席营业官 命令表明:查看文件的第2行到3行,使用地点范围“2,3”。取行就用sed,最轻易易行

 

2.4.2 彰显文件的第2行到第5行

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

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

5.1.2 修改文件 -i

  sed -i.bak 's#[1-9]#AA#g' person.txt

  -i.bak  先把文件备份为 person.txt.bak ,然后再修改文件的从头到尾的经过

   -i   参数要放在sed全体参数最前面

sed -i.bak.$(date %F) 's#[1-9]#AA#g' person.txt

[root@oldboyedu43 oldboy]# sed -i.bak.$(date %F) 's#[1-9]#AA#g' person.txt

[root@oldboyedu43 oldboy]# cat person.txt

AA0AA,oldboy,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

[root@oldboyedu43 oldboy]# cat person.txt.bak.2018-01-12

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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的行。

 

 

2.4.3 呈现文件最终一行

[root@zeq ~]# sed -n '$p' person.txt

110,ahao,COCO

5.2 变量替换

6.2.4.3 过滤四个字符

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

101,chensiqi,CEO

104,yy,CFO 命令表达: 使用扩大正则“|”,为了不应用转义符号“”,因而利用-r选项开启扩充正则说明式方式

 

2.4.4 展现文件中包涵zeq的行

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

101,zeq,CEO

5.2.1 变量替换

[root@oldboyedu43 oldboy]# a=oldboy    定义变量

[root@oldboyedu43 oldboy]# b=old       定义变量

[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 "s#$a#$b#g" person.txt   sed使用变量

101,old,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

7,sed命令应用知识扩充

2.4.5 展现文件中从包含101的行到105的行

[root@zeq ~]# sed -n '/101/,/105/p' person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

5.2.2 引号的分歧总计

1.单引号-所见即所得

[root@oldboyedu43 oldboy]# echo 'stu{1..6},`pwd`'

stu{1..6},`pwd`

2.双引号-对特殊符号进行剖析 $ $() ``

[root@oldboyedu43 oldboy]# echo "stu{1..6},`pwd`"

stu{1..6},/oldboy

[root@oldboyedu43 oldboy]# echo "I'm aaa"

I'm aaa                                         

[root@oldboyedu43 oldboy]# echo 'I'm aaa'

> ^C 想要显示单引号是需用双引号

3.不加引号和双引号同样,补助通配符{}*.txt

[root@oldboyedu43 oldboy]# echo stu{1..6},`pwd`

stu1,/oldboy stu2,/oldboy stu3,/oldboy stu4,/oldboy stu5,/oldboy stu6,/oldboy

4.反引号

[root@oldboyedu43 oldboy]# echo `pwd` ddd

/oldboy ddd

5.3 反向引用

()的效率能够禁止正则表明式的一有个别

扩展正则,使用-r

1援引第一个小括号中的相称内容, 2援引第三个小括号中的相配内容,sed最多能够记住9个

7.1 sed怎么样取不延续的行

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

101,chensiqi,CEO

103,Alex,COO

105,feixue,CIO

2.4.6 特殊写法:展现文件的第1和4行和5行

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

101,zeq,CEO

104,yy,CFO

105,faker,CIO

5.3.1 希图知识——sed &

sed &前面正则相配到的内容

[root@oldboyedu43 oldboy]# echo 123456|sed -r 's#([0-9])#<1>#g'

<1><2><3><4><5><6>

[root@oldboyedu43 oldboy]# echo 123456|sed  's#[0-9]#<&>#g'

<1><2><3><4><5><6>

[root@oldboyedu43 oldboy]# echo this is a test line | sed 's#.#<&>#g'

<t><h><i><s>< ><i><s>< ><a>< ><t><e><s><t>< ><l><i><n><e>

正则表明式 w 相称每二个单词,使用 <&>替换它,& 对应于以前所相称到的单词

[root@oldboyedu43 oldboy]# echo this is a test line | sed 's#w #<&>#g'

<this> <is> <a> <test> <line>

案例:echo "I am oldboy teacher." 假如想保留这一行的单词oldboy

[root@oldboyedu43 oldboy]# echo "I am oldboy teacher." |sed -r 's#.*(ol.*y).*#1#g'

oldboy

5.3.2 一声令下拼接——化解不会利用循环

将/oldboy/下全数.jpg的文书名修改为.avi

1. 先在显示屏上拼接出指标命令

[root@oldboyedu43 oldboy]# ls oldboy*.jpg |sed -r 's#(.*)jpg#mv & 1avi#g'

mv oldboy01.jpg oldboy01.avi

mv oldboy02.jpg oldboy02.avi

mv oldboy03.jpg oldboy03.avi

mv oldboy04.jpg oldboy04.avi

mv oldboy05.jpg oldboy05.avi

mv oldboy06.jpg oldboy06.avi

mv oldboy07.jpg oldboy07.avi

mv oldboy08.jpg oldboy08.avi

mv oldboy09.jpg oldboy09.avi

mv oldboy10.jpg oldboy10.avi

2. 终极交付 |bash施行

[root@oldboyedu43 oldboy]# ls oldboy*.jpg |sed -r 's#(.*)jpg#mv & 1avi#g' |bash

[root@oldboyedu43 oldboy]# ls oldboy*

oldboy01.avi  oldboy03.avi  oldboy05.avi  oldboy07.avi  oldboy09.avi  oldboy.txt

oldboy02.avi  oldboy04.avi  oldboy06.avi  oldboy08.avi  oldboy10.avi

5.4 拓展

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行的行号和内容

2.4.7 展现有规律的行

[root@zeq ~]# seq 10 |sed -n '1~2p'

1

3

5

7

9

5.4.1 rename替换(重命名)

rename     from         to         file...

        你要替换的剧情   替换到什么   替换哪些文件

rename      jpg         avi        *.jpg

[root@oldboyedu43 oldboy]# rename jpg avi *.jpg

[root@oldboyedu43 oldboy]# ls

oldboy01.avi  oldboy03.avi  oldboy05.avi  oldboy07.avi  oldboy09.avi    

oldboy02.avi  oldboy04.avi  oldboy06.avi  oldboy08.avi  oldboy10.avi  

 5.4.2 sed里面表示非

2.5 sed命令中利用变量

root@zeq ~]# x=zeq               设置x变量为zeq

[root@zeq ~]# y=zeq1             设置y变量为zeq1

[root@zeq ~]# sed 's#$x#$y#g'  person.txt

101,zeq1,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

12306,xiao.UFO

5.4.3 特殊符号=获取行号

2.5.1 把文件person.txt文件中的每一行的源委 替换为对应的行号

for n in {1..7}                     这里使用的shell脚本中的for循环

do

     sed -i.bak "${n}s#.*#$n#g" person.txt

done

5.4.4 一条sed语句实施多条命令

2.5.2 批量重命名:删除文件名中的html_

touch zeq_html_{01..10}.jpg

方法1  命令行格式

[root@zeq data]# ls *.jpg|sed -r "s#(.*)(_.*)#mv & zeq2#g"|bash

方法2  for循环

for i in {01..10}

do

mv zeq_${i}.jpg  zeq_html_${i}.jpg 

done

方法3  rename

rename  html_  ""    *.jpg        rename   修改谁    改为什么    修改什么文件

 

第6章 动用sed命令常见的坑

6.1 -r 与-i同有时候利用

  -r 参数在后面

-ri  正常

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldboooy

test

[root@oldboyedu43 oldboy]# sed -ri 's#[o] {2}#AAAA#g' ett.txt

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldbAAAAy

test

-ir  先把公文备份为xxr,然后再交替文件中的内容

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldboy                                                           源文件内容

test

[root@oldboyedu43 oldboy]# sed -ir 's#[l] {2}#o#g' ett.txt       sed -ir先备份 

[root@oldboyedu43 oldboy]# ll ett.*

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:56 ett.txtr                 备份为ett.txtr

[root@oldboyedu43 oldboy]# cat ett.txt                        因为在上面的命令里r已经不是参数,所以sed 默认不支持扩展正则,文件没有被修改,只是备份

oldboy                                                           

olldboy

test

[root@oldboyedu43 oldboy]# cat ett.txtr

oldboy

olldboy

test

[root@oldboyedu43 oldboy]# sed -rir 's#[l] {2}#o#g' ett.txt  重新给sed 加上 -r 参数,使 sed支持扩展正则

[root@oldboyedu43 oldboy]# ll ett.*                                    

-rw-r--r-- 1 root root 19 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txtr                             新备份的文件覆盖了刚才的文件

[root@oldboyedu43 oldboy]# cat ett.txt                                     源文件被替换

oldboy

oodboy

test

[root@oldboyedu43 oldboy]# cat ett.txtr                                 备份文件内容不变

oldboy

olldboy

test

6.2 -i制止与-n一齐利用(回看sed的实践进度)

 -i与-n一齐利用会把源文件的开始和结果清空

[root@oldboyedu43 oldboy]# cat ett.txtr

oldboy

olldboy

test

[root@oldboyedu43 oldboy]# sed -ni 's#oldboy#123456#g' ett.txtr

[root@oldboyedu43 oldboy]# cat ett.txtr |wc -l

0

本文由星彩网app下载发布于星彩网app下载,转载请注明出处:不看绝对后悔的Linux三剑客之sed实战精讲

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。