第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,UFO\【澳门金沙国际】不六柱预测对后悔的Linux三剑客之sed实战精讲。n107,lee,XO’ person.txt

        #a==append 追加

        #i==insert 插入

        # echo -e ‘106,wuxingge,UFO\n107,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等一声令下。不过这几个命令效能不高,那就好比一块空地准备搭建房子,请了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 批量修改文件名

    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”:追加文本到指定行后,回想方法: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,UFO\n12580,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
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查。

 

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,UFO\n107,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,UFO\n107,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,亚历克斯,老董 命令表达:

在地方范围“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.#\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

 

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 & zeq\2#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

相关文章