过滤:

第1章 sed知识点

Sed

证实:本篇小说来源老男孩,那里只做备份记录

  sed -n‘/过滤的内容/处理的下令’ 文件

1.1 sed是什么

sed:linux3徘徊花之一,sed是一个很好的文书处理工科具,本人是八个管道命令,重尽管以行为单位开始展览拍卖,能够将数据行开始展览沟通、删除、新扩张、选用等特定职业。

功能表达

       -n 撤销sed的默许输出

字符流编辑器 Stream 艾德itor

个中,sed的替换功效应用极为常见,上边首要先介绍下它的交替功用。

Sed是Stream
艾德itor(流编辑器)缩写,是操作、过滤和更改文本内容的无敌区工作具。常用成效有增加和删除改查,过滤,取行。

       -i 改换文件内容。

sed是壹种流编辑器,它是文本处理中12分中的工具,能够完美的杰出正则表达式使用,成效满腹经纶。处理时,把最近处理的行存款和储蓄在方今缓冲区中,称为“方式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理到位后,把缓冲区的内容送往显示屏。接着处理下一行,那样持续重复,直到文件末尾。

取IP地址的例子:过滤效果

[root@oldboy ~]# sed –version  #→ sed软件版本

    处理的授命:p print打字与印刷,d delete删除,

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
—小尾巴/修饰

  ifconfig eth0|sed -n ‘2p’|sed -nr ‘s#^.*addr:([0-9].*sed。)
B.*#\1#gp’

GNU sed version 4.2.1

     例子:

1.4 sed 命令运转过程

sed是壹种流编辑器,它是文本处理中丰硕中的工具,能够完美的格外正则表明式使用,功用头角峥嵘。处理时,把当前处理的行存款和储蓄在临时缓冲区中,称为“情势空间”(pattern
space),接着用sed命令处理缓冲区中的内容,处理完了后,把缓冲区的剧情送往荧屏。接着处理下一行,那样不断重复,直到文件末尾。

  结果:ip地址

语法格式

          sed’/oldboy/d’ test.txt

第2章 查询 p(print)

sed替换效用举例如下:

sed [options] [sed-commands] [input-file]

          sed -n’/oldboy/p’ test. Txt

2.1 按行查询

[root@xhsj_ClouderaManager test]# cat test.txt
oldboy
oldboy

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

sed替换:*****

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 ‘三p’ person.txt

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

103,Alex,COO

二. 展现文件的末段一行  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

把oldboy替换成oldgirl:

说明:

  sed -i’s#oldboy#oldgirl#g’ a.txt

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

sed -i ‘s/oldboy/oldgirl/’ test.txt

  1. 小心sed和前面包车型地铁抉择之间起码有2个空格。

     s常说的探寻并替换,用一个字符串替换来另四个

2.1.3 过滤多少个字符

-r
援助扩张正则表达式

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

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

101,oldboy,CEO

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

结果:

2.
为了幸免混淆,本文称呼sed为sed软件。sed-commands(sed命令)是sed软件放置的片段限令选项,为了和眼下的options(选项)区分,故称为sed命令。

       g(globaI)与s联合使用时,表示对现阶段行全局相配替换(与下四个g意义不相同)

第3章 增加

cat test.txt
oldgirl
oldgirl

  1. sed-commands既能够是单个sed命令,也得以是四个sed命令组合。

  2. input-file(输入文件)是可挑选,sed还是可以够从规范输入如管道获取输入。

       -i修改文件内容

3.1 单行扩大

a
追加append,在内定行后增加1行或多行文本

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

s:表示查找并替换。 

命令推行流程

  #是分隔符,能够用/@等替换。

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
能够写入

find与sed结合以及例子

把/data/目录下全部隐含test文件的个中的始末里的oldboy换来oldgirl:
find与sed结合

[root@saltstack-client1 data]# pwd

/data

[root@saltstack-client1 data]# ls

a  b  c  d  e  test  tomcat 

法一:

[root@saltstack-client1 data]# find /data/ -type f -name “test.txt”
|xargs sed -i ‘s#oldboy#oldgirl#g’ 

法二:

[root@saltstack-client1 data]# find /data/ -type f -name “test.txt”
-exec sed -i  ‘s#oldboy#oldgirl#g’ {} \; 

包蕴流程:Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再出口一行……

     = 表示行号

第4章 删除

Sed命令实战复习回想

形式空间:sed软件内部的三个临时缓存,用于存放读取到的内容。

Sed 正则相配

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

打印

例子:

[root@saltstack-client1 data]# cat oldboy.txt

ddd fff

2ddd fff

3ddd fff 

打字与印刷第3行内容:

[root@saltstack-client1 data]#澳门金沙国际 , sed -n ‘2p’ oldboy.txt

2ddd fff 

打字与印刷第二行到第壹行的始末:

[root@saltstack-client1 data]# sed -n ‘1,2p’ oldboy.txt

ddd fff

2ddd fff

行使范例

  sed -r ‘s#(能够用正则匹配)#\1#g’ 文件。sed利用后向引用功用时要带-r参数。

4.2 多行删除

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

105,feixue,CIO

替换

把文件里内容里的兼具的ddd换来oldboy:

[root@saltstack-client1 data]# sed -i ‘s#ddd#oldboy#g’ oldboy.txt

[root@saltstack-client1 data]# cat oldboy.txt

oldboy fff

2oldboy fff

3oldboy fff

  1. 统一实验文本

 

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

Sed的后项引用

Sed的后项引用:

 

后向引用的事例:

收取ip地址的例证:sed 

 [root@saltstack-client2 test]# ifconfig

eth2      Link encap:Ethernet  HWaddr 52:54:00:55:D7:6D 

          inet addr:10.122.129.55  Bcast:10.122.129.255 
Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:2876420 errors:0 dropped:0 overruns:0 frame:0

          TX packets:265070 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:693181412 (661.0 MiB)  TX bytes:24669346 (23.5 MiB)

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:84802 errors:0 dropped:0 overruns:0 frame:0

          TX packets:84802 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:4240622 (4.0 MiB)  TX bytes:4240622 (4.0 MiB)

 

法一:sed 

[root@saltstack-client2 test]# ifconfig eth2|sed -n
‘s#^.*dr:\([0-9].*\) Bcast.*$#\1#gp’

10.122.129.55 

法二:sed

[root@saltstack-client2 test]# ifconfig|sed -n ‘2p’|sed -n
‘s#^.*dr:\([0-9].*\) Bcast.*$#\1#gp’

10.122.129.55

法三:本身搞的

[root@saltstack-client1 ~]# ifconfig eth2

eth2      Link encap:Ethernet  HWaddr 52:54:00:3C:DD:D5 

          inet addr:10.122.129.54  Bcast:10.122.129.255 
Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:3775521 errors:0 dropped:0 overruns:0 frame:0

          TX packets:418876 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:881222306 (840.3 MiB)  TX bytes:38853944 (37.0 MiB)

 

 [root@saltstack-client1 ~]# ifconfig eth2|sed -n ‘s#^.*
addr:\([0-9].*\) Bca.*$#\1#gp’

10.122.129.54

# 创建包蕴上面内容的文件,前边的操作都会接纳那些文件。

第5章 替换

Sed与正则表达式相关以及有关的例证

sed -r ‘s#(能够用正则相配)#\1#g’ oldboy.txt 

r:表示小括号里一些特殊字符不需求反斜线转义了,而是利用正则。 

例子:

[root@saltstack-client1 data]# cat oldboy.txt

oldboy fff

2oldboy fff

3oldboy fff

[root@saltstack-client1 data]# sed -r ‘s#(.*)ff#\1#g’ oldboy.txt

oldboy f

2oldboy f

3oldboy f

[root@saltstack-client1 data]# sed -r ‘s#(.*)f#\1#g’ oldboy.txt

oldboy ff

2oldboy ff

3oldboy ff

[root@saltstack-client1 data]# sed -r ‘s#(.*) (.*)#\1 \2#g’
oldboy.txt

oldboy fff

2oldboy fff

3oldboy fff

[root@saltstack-client1 data]# sed -r ‘s#(.*)#\1#g’ oldboy.txt

oldboy fff

2oldboy fff

3oldboy fff 

 

[root@oldboy ~]# cat person.txt

5.1 文本替换

101,oldboy,CEO

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

  s
  单独使用——>将每1行中首先个门户差不离的字符串进行替换

[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的更迭标记之1(全局替换)

[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

102,zhangyao,CTO

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

103,Alex,COO

5.2 变量替换

104,yy,CFO

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

105,feixue,CIO

5.2.2 引号的界别计算

一.单引号-所见即所得

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

stu{1..6},`pwd`

二.双引号-对特殊符号进行辨析 $ $() “

[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 想要显示单引号是需用双引号

三.不加引号和双引号同样,协助通配符{}*.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 反向引用

()的作用能够禁止正则表明式的1有的

恢宏正则,使用-r

\一引用第多个小括号中的相称内容, \2引用第三个小括号中的相称内容,sed最多可以记住玖个

  1. 增加和删除改查

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.”
假设想保留那1行的单词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 拓展

2.1 增

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里面表示非

a 追Gavin本到钦赐行后

5.4.3 特殊符号=获取行号

i 插入文本到钦命行前

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

二.一.一 单行扩充

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

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

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

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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

101,oldboy,CEO

106,dandan,CSO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

二.壹.贰 多行扩张

[root@oldboy ~]# sed ‘2a 106,dandan,CSO\n107,bingbing,CCO’
person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO #→第1种写法

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed ‘2a 106,dandan,CSO \

> 107,bingbing,CCO’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO #→第2种写法

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

#→sed命令i的运用办法是如出壹辙的,因而不再列出。

商城案例一:优化SSH配置(壹键产生增增添少参数)

在大家上学种类优化时,有二个优化点:改造ssh服务远程登入的布局。首要的操作是在ssh的安顿文件参加下边伍行文本。(下边参数的现实性意思见其余学科。)

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

我们能够动用vi命令编辑那一个文件,但诸如此类就比较费力,未来想一条命令扩充伍行文本到第23行前?

点名试行的地点范围

sed软件能够对单行或多行实行拍卖。如果在sed命令前边不钦点地址范围,那么暗中认可会协作全数行。

用法:n1[,n2]{sed-commands}

地点用逗号分隔的,n一,n2能够用数字、正则表明式、或双方的组合代表。

例子:

10{sed-commands}        对第10行操作

10,20{sed-commands}    对10到20行操作,包括第10,20行

10,+20{sed-commands}  对10到30(10+20)行操作,包括第10,30行

1~2{sed-commands}      对1,3,5,7,……行操作

十,${sed-commands}    对十到结尾1行($代表最终一行)操作,包罗第十行

/oldboy/{sed-commands}        对相配oldboy的行操作

/oldboy/,/亚历克斯/{sed-commands}  对相配oldboy的行到相配亚历克斯的行操作

/oldboy/,${sed-commands}      对匹配oldboy的行到最后壹行操作

/oldboy/,拾{sed-commands}     
对相称oldboy的行到第7行操作,注意:如若前拾行并未相称到oldboy,sed软件会显得10行未来的相配oldboy的行,要是有。

一,/亚历克斯/{sed-commands}        对第2行到相称亚历克斯的行操作

/oldboy/,+二{sed-commands}      对匹配oldboy的行到现在的2行操作

2.2 删

d 删除钦定的行

[root@oldboy ~]# sed ‘d’ person.txt

[root@oldboy ~]#

[root@oldboy ~]# sed ‘2d’ person.txt

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed ‘2,5d’ person.txt

101,oldboy,CEO

[root@oldboy ~]# sed ‘3,$d’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

[root@oldboy ~]# sed ‘1~2d’ person.txt

102,zhangyao,CTO

104,yy,CFO

[root@oldboy ~]# sed  ‘1,+2d’ person.txt

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed ‘/zhangyao/d’ person.txt

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed ‘/oldboy/,/Alex/d’ person.txt

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed ‘/oldboy/,3d’ person.txt

104,yy,CFO

105,feixue,CIO

供销合作社案例二:打字与印刷文件内容但不包涵oldboy

[root@oldboy ~]# sed ‘/oldboy/d’ person.txt #→删除包蕴”oldboy”的行

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.3 改

二.叁.一 按行替换

c 用新行取代旧行

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

101,oldboy,CEO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.三.2 文本替换

s:单独接纳→将每一行中第一处同盟的字符串举行替换 ==>sed命令

g:每壹行开始展览全方位沟通 ==>sed命令s的轮换标识之一,非sed命令

-i:修改文件内容 ==>sed软件的选料

sed软件替换模型(方框▇被替换到三角▲)

sed -i ‘s/▇/▲/g’ oldboy.log

sed -i ‘s#▇#▲#g’ oldboy.log

着眼特点

两边是引号,引号里面包车型地铁两边分别为s和g,中间是多个一样的字符/或#用作定界符。#能在轮换内容包涵/有助于区分。定界符能够是任意符号如:或|等,但当替换内容涵盖定界符时,需转义即:|。经过长期实施,提议我们利用#作为定界符。

定界符/或#,第3个和第叁个以内的正是被调换的内容,第二个和首个之间的便是替换后的剧情。

s#▇#▲#g,▇能用正则表明式,但▲不能够用,必须是现实的。

暗中同意sed软件是对方式空间(内部存款和储蓄器中的多寡)操作,而-i选项会变动磁盘上的文本内容。

[root@oldboy ~]# sed ‘s#zhangyao#oldboyedu#g’ person.txt

101,oldboy,CEO

102,oldboyedu,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -i ‘s#zhangyao#BBB#g’ person.txt

[root@oldboy ~]# cat person.txt

101,oldboy,CEO

102,BBB,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -i ‘s#oldboyedu#zhangyao#g’ person.txt
#→还原测试文件

合营社案例三:钦赐行修改配置文件

内定行标准修改配置文件,那样可避防御止改良主义改多了地点。

[root@oldboy ~]# sed ‘3s#0#9#’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

193,Alex,COO

104,yy,CFO

105,feixue,CIO

二.三.3 变量替换

[root@oldboy ~]# cat test.txt #→再新建一个文件

a

b

a

[root@oldboy ~]# x=a

[root@oldboy ~]# y=b

[root@oldboy ~]# echo $x $y

a b

[root@oldboy ~]# sed s#$x#$y#g test.txt

b

b

b

[root@oldboy ~]# sed ‘s#$x#$y#g’ test.txt

a

b

a

[root@oldboy ~]# sed ‘s#’$x’#’$y’#g’ test.txt

b

b

b

[root@oldboy ~]# sed “s#$x#$y#g” test.txt

b

b

b

[root@oldboy ~]# eval sed ‘s#$x#$y#g’ test.txt

b

b

b

2.叁.四 分组替换\( \)和\一的施用验证

sed软件的\(
\)的功能能够记住正则表达式的壹局部,个中,\一为率先个牢记的情势即首先个小括号中的相配内容,\2遍之历历在目标情势,即第1个小括号中的相称内容,sed最多能够记住几个。

例:echo I am oldboy
teacher.借使想保留那1行的单词oldboy,删除剩下的片段,使用圆括号标志想保留的一部分。

[root@oldboy ~]# echo I am oldboy teacher. |sed ‘s#^.*am
\([a-z].*\) tea.*$#\1#g’

oldboy

[root@oldboy ~]# echo I am oldboy teacher. |sed -r ‘s#^.*am
([a-z].*) tea.*$#\1#g’

oldboy

[root@oldboy ~]# echo I am oldboy teacher. |sed -r ‘s#I (.*) (.*)
teacher.#\1\2#g’

amoldboy

一声令下表明

思路:用oldboy字符替换I am oldboy teacher.

上边解释用□庖代空格

^.*am□–>那句的情致是以自由字符开首到am□截至,相配文件中的I
am□字符串;

\([a-z].*\)□–>那句的外壳正是括号\(\),里面的[a-z]代表11分2五个假名的其它一个,[a-z].*合起来就是非凡任意七个字符,本题来讲正是相配oldboy字符串,由于oldboy字符串是急需保留的,因而用括号括起来十分,前边通过\1来取oldboy字符串。

□tea.*$–>表示以空格tea初阶,任意字符结尾,实际正是相配oldboy字符串后,紧接着的字符串□teacher.;

末尾被轮换的剧情中的\壹正是取后边的括号里的剧情了,约等于我们要的oldboy字符串。

()是扩充正则表明式的元字符,sed软件暗中同意识别基本正则表明式,想要使用扩展正则须要选取\转义,即\(\)。sed使用-r选项则可以辨认扩张正则表明式,此时采用\(\)反而会出错。

集团案例肆:系统开机运行项优化

[root@oldboy ~]# chkconfig –list|grep “3:on”|grep -vE
“sshd|crond|network|rsyslog|sysstat”|awk ‘{print $1}’|sed -r 
‘s#^(.*)#chkconfig \1 off#g’|bash

[root@oldboy ~]# chkconfig –list|grep “3:on”

crond          0:off  1:off  2:on    3:on    4:on    5:on    6:off

network        0:off  1:off  2:on    3:on    4:on    5:on    6:off

rsyslog        0:off  1:off  2:on    3:on    4:on    5:on    6:off

sshd            0:off  1:off  2:on    3:on    4:on    5:on    6:off

sysstat        0:off  1:on    2:on    3:on    4:on    5:on    6:off

二.3.5 特殊符号&代表被轮换的剧情

[root@oldboy ~]# sed ‘1,3s#C#–&–#g’ person.txt #→此处&等于C

101,oldboy,–C–EO      #→将1到3行的C替换为–C–

102,zhangyao,–C–TO

103,yy,–C–OO

104,feixue,CFO

105,dandan,CIO

合作社案例5:批量重命名文件

当前目录下有文件如下所示:

[root@oldboy test]# ls

stu_102999_1_finished.jpg stu_102999_2_finished.jpg
stu_102999_3_finished.jpg stu_102999_4_finished.jpg
stu_102999_5_finished.jpg

供给用sed命令重命名,效果为stu_102999_1_finished.jpg==>stu_102999_一.jpg,即除去文件名的_finished

2.4 查

p 输出钦赐内容,但暗许会输出二次合作的结果,由此利用n撤销暗许输出

贰.4.一 按行查询

[root@oldboy ~]# sed ‘2p’ person.txt

101,oldboy,CEO

102,zhangyao,CTO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -n ‘2p’ person.txt

102,zhangyao,CTO

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

102,zhangyao,CTO

103,Alex,COO

表达:取行就用sed,最简便易行

[root@oldboy ~]# sed -n ‘1~2p’ person.txt

101,oldboy,CEO

103,Alex,COO

105,feixue,CIO

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

101,oldboy,CEO

102,zhangyao,CTO

103,yy,COO

104,feixue,CFO

105,dandan,CIO

二.4.2 按字符串查询

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

102,zhangyao,CTO

[root@oldboy ~]# sed -n ‘/CTO/,/CFO/p’ person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

二.四.3 混合查询

[root@oldboy ~]# sed -n ‘2,/CFO/p’ person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

[root@oldboy ~]# sed -n ‘/feixue/,2p’ person.txt

105,feixue,CIO

#→特殊景况,前两行并未相配到feixue,就向后极度,如若同盟到feixue就打字与印刷此行。

博文首发张耀的博客:http://www.zyops.com/commands-sed

相关文章