sed

By admin in 美高梅手机版4858 on 2019年4月15日

过滤:

第1章 sed知识点

Sed

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

  sed -n‘/过滤的剧情/处理的通令’ 文件

1.1 sed是什么

sed:linux3剑客之1,sed是三个很好的公文处理工科具,本人是三个管道命令,首借使以行为单位开始展览处理,可以将数据行进行沟通、删除、新增、采纳等一定工作。

职能表明

       -n 撤废sed的暗中同意输出

字符流编辑器 Stream 艾德itor

里面,sed的更迭作用选拔极为常见,上面首要先介绍下它的轮换作用。

Sed是Stream
艾德itor(流编辑器)缩写,是操作、过滤和调换文本内容的兵不血刃工具。常用功效有增加和删除改查,过滤,取行。

       -i 改动文件内容。

sed是一种流编辑器,它是文本处理中丰硕中的工具,能够周全的万分正则表明式使用,效率百里挑一。处理时,把近来处理的行存款和储蓄在方今缓冲区中,称为“形式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理到位后,把缓冲区的内容送往显示屏。接着处理下1行,那样持续重复,直到文件末尾。

取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].*)
B.*#\1#gp’

GNU sed version 4.2.1

     例子:

1.4 sed 命令运维进程

sed是1种流编辑器,它是文本处理中非常中的工具,能够周全的相称正则表明式使用,功能出类拔萃。处理时,把当前拍卖的行存款和储蓄在暂时缓冲区中,称为“形式空间”(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 ‘3p’ person.txt

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

103,Alex,COO

二. 显示文件的末梢1行  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和前面包车型客车选项之间起码有3个空格。

     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:表示查找并替换。 

指令执行流程

  #是分隔符,可以用/@等替换。

sed。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软件从文件或管道中读取一行,处理一行,输出1行;再读取1行,再处理1行,再出口一行……

     = 表示行号

第4章 删除

Sed命令实战复习回看

格局空间:sed软件内部的1个近期缓存,用于存放读取到的始末。

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 

打字与印刷第一行内容:

[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
  单独选用——>将每一行中首先个卓殊的字符串实行轮换

[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
每1行开始展览全方位轮换——>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

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

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 反向引用

()的功效能够禁止正则表明式的1有的

扩张正则,使用-r

\壹引用首个小括号中的相配内容, \二引用第3个小括号中的相配内容,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\+
相配每3个单词,使用 <&>替换它,&
对应于在此以前所相称到的单词

[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 拓展

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 追加文本到钦赐行后

5.4.3 特殊符号=获取行号

i 插入文本到钦赐行前

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

2.1.① 单行扩展

第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禁止与-n1起行使(回看sed的进行进程)

 -i与-n1起使用会把源文件的内容清空

[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

2.1.二 多行扩大

[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的施用方式是壹模1样的,由此不再列出。

集团案例一:优化SSH配置(一键到位扩张加少参数)

在我们上学种类优化时,有贰个优化点:更动ssh服务远程登录的安顿。首要的操作是在ssh的布局文件参预下边5行文本。(下边参数的有血有肉意思见别的学科。)

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

我们得以行使vi命令编辑这些文件,但如此就比较麻烦,未来想一条命令增添五行文本到第1叁行前?

钦点执行的地址范围

sed软件能够对单行或多行开始展览处理。假使在sed命令前边不点名地方范围,那么默许会协作全部行。

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

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

例子:

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,……行操作

10,${sed-commands}    对10到终极1行($代表最后一行)操作,包涵第八行

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

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

/oldboy/,${sed-commands}      对相称oldboy的行到最后1行操作

/oldboy/,十{sed-commands}     
对匹配oldboy的行到第玖行操作,注意:假若前十行并未有相配到oldboy,sed软件会显示10行今后的相配oldboy的行,假若有。

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

/oldboy/,+贰{sed-commands}      对相配oldboy的行到今后的二行操作

2.2 删

d 删除钦赐的行

[root@oldboy 美高梅手机版4858,~]# 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 改

2.叁.一 按行替换

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

二.三.贰 文本替换

s:单独使用→将每1行中第一处10分的字符串进行轮换 ==>sed命令

g:每一行开始展览总体替换 ==>sed命令s的交替标志之1,非sed命令

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

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

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

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

着眼特点

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

定界符/或#,第三个和第四个以内的便是被轮换的剧情,首个和第玖个之间的就是替换后的始末。

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 #→再新建2个文件

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

二.三.四 分组替换\( \)和\一的利用验证

sed软件的\(
\)的效益能够记住正则表达式的一部分,个中,\一为第二个牢记的方式即首先个小括号中的相称内容,\二遍之难忘的方式,即第一个小括号中的相称内容,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]代表相当210个假名的其余一个,[a-z].*合起来就是相当任意三个字符,本题来说正是相配oldboy字符串,由于oldboy字符串是急需保留的,因而用括号括起来非凡,后面通过\1来取oldboy字符串。

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

末端被交流的内容中的\一正是取前面的括号里的内容了,约等于大家要的oldboy字符串。

()是扩展正则表达式的元字符,sed软件暗中认可识别基本正则表明式,想要使用增添正则供给选拔\转义,即\(\)。sed使用-r选项则能够辨认扩充正则表明式,此时选取\(\)反而会出错。

公司案例4:系统开机运转项优化

[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

2.三.伍 特殊符号&代表被替换的剧情

[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 输出内定内容,但默许会输出2次相当的结果,因而选择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

二.四.二 按字符串查询

[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

2.4.三 混合查询

[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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有