linux三剑客之sed命令

作者:电脑系统

四、使用规范文件

[root@chengliang zcl]# cat zcl.txt
[root@chengliang zcl]# cat > zcl.txt <<KOF
> 101,chengliang,aa
> 102,alex,bb
> 103,eric,cc
> 104,laonanhai,dd
> KOF
[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

KOF必得成对出现,表示终止输入

指令表明:使用一条cat命令创建多行文本,文件包罗下边包车型大巴开始和结果,后边的操作都会利用那一个文件。

 

除去内定行文本

地址范围 含义
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到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/, 2{sed-commands} 对匹配chensiqi的行到其后的2行操作

假诺在sed命令后边不点名地方范围,那么暗中认可会同盟全数行,然后利用d命令删除效能就能够删除那个文件的全部情节

[root@chengliang zcl]# cat test.txt  
welcome to my blog:http://www.cnblogs.com/0zcl

if you like my blog's contents,please support me!


bye! boys and girls.
[root@chengliang zcl]# sed "d" test.txt
[root@chengliang zcl]# 

单行删除想必我们能理解,钦点删除第2行的公文102,alex,bb

[root@chengliang zcl]# sed "2d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

"2,3d" 钦赐删除第2行到第3行的剧情,d代表删除操作。

[root@chengliang zcl]# sed "2,3d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]#

  

正则相配删除

上边大家尝试完了数字地址范围,接下去大家尝试一下正则表明式的地方范围,固然说能够采取正则表明式,但是大家照旧习于旧贯写出全体的匹配字符串,抵达规范相配的指标。

在sed软件中,使用正则的格式和awk同样,使用2个”/“包括钦命的正则表明式,即“/正则表明式/”。"/alex/d"有哪一行有alex则删除这一行。

[root@chengliang zcl]# sed "/alex/d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

那是正则表明式格局的多行删除,也是以逗号分隔2个地方,最终结果是删除包含“alex”的行到饱含“eric”的行

[root@chengliang zcl]# sed "/alex/,/eric/d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]# 

学过正则表明式后大家清楚“$”代表行尾,然而在sed中就有一部分转移了,“$”在sed中象征文件的最后一行。因而本例子的含义是删除第2行到最终一行的公文,包括第2行和尾声一行,由此只剩余第1行的源委。

[root@chengliang zcl]# sed "2,$d" zcl.txt
sed: -e expression #1, char 2: unexpected `,'
[root@chengliang zcl]# sed "2,$d" zcl.txt
101,chengliang,aa
[root@chengliang zcl]# sed '2,$d' zcl.txt    
101,chengliang,aa
[root@chengliang zcl]# 

在专门的工作中大家最常用的照旧数字地址这种精确相称格局,像上边的正则地址或混合地址这种歪曲相配用的可比少,掌握即可。

现实可参看:

 

引号的区分计算

sed使用的进程中用单引号依旧双引号?这里给大家详细说说引号的区分。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed '2i $PATH' zcl.txt     #单引号--文本内容原封不动插入
101,chengliang,aa
$PATH
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed "2i $PATH" zcl.txt    #双引号--变量$PATH被解析以后在当作文本进行插入
101,chengliang,aa
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed 2i $PATH zcl.txt    #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行
sed: -e expression #1, char 2: expected  after `a', `c' or `i'
[root@chengliang zcl]# 

总结:

  • 若是引号里面是平时字符串的话,你能够随便使用单引号可能双引号:
  • 假使引号里面是变量也许带反引号的一声令下的话,你想要变量深入分析的结果照旧命令施行的结果,那就动用双引号;你想要引号内的外貌字符串,那就使用单引号。

文件替换

有专门的学问经验的同学应该丰富的耳闻则诵,因为使用sed软件十分七的景色正是应用替换效用。

此间运用的sed命令,选项:(主要)

  • “s”:单独行使-->将每一行中率先处相配的字符串进行调换==>sed命令
  • “g”:每一行举办任何交替-->sed命令s的交替标记之一(全局替换),非sed命令。
  • “-i”:修改文件内容-->sed软件的选项,注意和sed命令i差距。

sed软件替换模型  ===>  sed -i 's#对象内容#轮换内容#g'

  • 定界符/或#,第两个和第三个之间的正是被轮换的内容,第叁个和第多少个里面包车型地铁正是替换后的剧情。建议大家利用#用作定界符。
  • s#对象内容#轮换内容#g ,“目的内容”能用正则表明式,但替换内容无法用,必得是有血有肉的。因为替换内容使用正则的话会让sed软件心中无数,它不明了你要替换什么内容。
  • 默许sed软件是对形式空间(内部存款和储蓄器中的数额)操作,而-i选项会改造磁盘上的公文内容。

结果为第二行的“bb”替换为“i am bb”。

[root@chengliang zcl]# sed "s#bb#i am bb#g" zcl.txt              
101,chengliang,aa
102,alex,i am bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

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

指令表明:倘若想真正的改造文件内容,大家就需求使用采取“-i”。同期大家得以窥见命令试行后的结果是不曾另外输出的。

 

咱俩想查看文件中的有个别行,从前最常用的是cat或more或less命令等,但那几个命令有些欠缺,正是不能查看钦点的行。而大家用了十分久的sed命令就有了那些效率了。何况大家前面也说过使用sed比此外命令vim等读取速度越来越快!

“p”:输出钦赐内容,但暗中同意会输出2次非常的结果,因而使用-n选项撤除暗许输出,回想方法:p的全拼是print,意思是打字与印刷。

按行查询

[root@chengliang zcl]# sed "2p" zcl.txt
101,chengliang,aa
102,alex,bb
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "2p" zcl.txt
102,alex,bb
[root@chengliang zcl]# 
命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chengliang zcl]# sed -n "2,3p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 
命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[root@chengliang zcl]# sed -n "1~2p" zcl.txt
101,chengliang,aa
103,eric,cc
命令说明:打印文件的1,3,5行。~代表步长

[root@chengliang zcl]# sed -n "p" zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 
命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[root@chengliang zcl]# sed -n "/alex/p" zcl.txt    ==>命令说明:打印含CTO的行
102,alex,bb
[root@chengliang zcl]# 
[root@chengliang zcl]# sed -n "/alex/,/chengliang/p" zcl.txt
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "/alex/,/eric/p" zcl.txt    ==>命令说明:打印含alex的行到含eric的行
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

混合查询

[root@chengliang zcl]# sed -n "2, /cc/p" zcl.txt
102,alex,bb
103,eric,cc
命令说明:打印第2行到含cc的行。

[root@chengliang zcl]# sed -n "/cc/,2p" zcl.txt
103,eric,cc
[root@chengliang zcl]# 
命令说明:特殊情况,前两行没有匹配到cc,就向后匹配,如果匹配到cc就打印此行。所以这种混合地址不推荐使用。

 过滤多少个字符

[root@chengliang zcl]# sed -rn "/alex|cc/p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

指令表达: 使用扩充正则“|”,为了不采用转义符号“”,由此选拔-r选项开启扩充正则表明式情势

 

二、软件成效与版本

Sed命令是操作,过滤和更改文本内容的精锐工具。常用作用有增加和删除改查(扩充,删除,修改,查询),在那之中查询的效果中最常用的2大效果是过滤(过滤内定字符串),取行(收取钦命行)。

小编们现在打算上学的sed版本是GNU开源版本

[root@chengliang mail]# sed --version
GNU sed version 4.2.1

  

 

五、常用功能-增加和删除改查

1、增

比如大家日常往配置文件写入几行文本,最常用的是vi或vim命令,但是那2个指令是一种交互式的下令,还供给大家在vi/vim编辑器分界面输入字符串然后保留退出,操作有个别麻烦然而还是能够用。可是当我们学会了Shell脚本后,大家就能够发觉在剧本中不可能平常使用vi或vim命令,为啥呢?同学们请自行体验。

此处咱们要求用到2个sed命令,分别是:

  • “a”:追Gavin本到钦赐行后,纪念方法:a的全拼是append,意思是充实。
  • “i“:插入文本到内定行前,回忆方法:i的全拼是insert,意思是插入。

在文书中追加一行文本,大家在此以前学过echo命令能够在文件的末尾追Gavin本,比较简单,不过大家还会有另外的错综相连须求,比方在第10行插入一行数字等等,这里就必要sed出马了。

[root@chengliang zcl]# sed "2a hahaha" zcl.txt
101,chengliang,aa
102,alex,bb
hahaha  #新增的那句
103,eric,cc
104,laonanhai,dd

一、前言

大家都清楚,在Linux中任何皆文件,比如配置文件,日志文件,启动文件等等。假设大家相对这个文件进行一些编辑查询等操作时,大家可能会想到一些vi,vim,cat,more等一声令下。然则这一个命令作用不高,那就好比一块空地计划搭建屋企,请了13个师傅拿着铁锹挖地基,花了一个月的时日才挖完,而除此以外一块空地则请了个挖土机,三下五除二就解决了,那正是成效。而在linux中的“挖土机”有三种型号:顶配awk,中配sed,标配grep。使用这一个工具,大家能够在直达一样效果的前提下节省大量的重复性工作,进步效用。

sed 是Stream Editor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家能够设想以下流水生产线,sed就像是三个车间一律,文件中的每行字符都以原料,运出sed车间,然后经过一雨后玉兰片的加工管理,最终从流水生产线下来就改成货色了。

编写文件也是那样,在此以前小编们修改贰个配置文件,须要活动光标到某一行,然后增多点文字,然后又移动光标到另一行,注释点东西.......只怕改换贰个陈设文件下来需求开支数十分钟,还也许有希望改错了配置文件,又得返工。那如故几个安顿文件,固然数11个数百个呢?由此当您学会了sed命令,你会发掘使用它处理公事中的一雨后玉兰片修改是很有用的。只要想到在差不离100八个文件中,管理18个不等的编纂操作能够在几分钟以内实现,你就能清楚sed的有力了。

 

sed修改文件的同不经常候扩充备份

[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt
[root@chengliang zcl]# sed -i.bak "s#chengliang#Fuck#g" zcl.txt
[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt  zcl.txt.bak
[root@chengliang zcl]# cat zcl.txt
101,Fuck,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# cat zcl.txt.bak
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令行表明: 在-i参数的末尾加上.bak(.猖獗字符),sed会对文本实行先备份后修改

 

分组替换()和1的采用验证

sed软件的()的法力能够记住正则表明式的一局地,个中, style="color: #ff0000;">1为率先个难忘的情势即首先个小括号中的相配内容,2次之个难忘的方式,即第二个小括号中的相称内容,sed最多能够记住9个。

例:echo "I am chensiqi teacher."  假若想保留这一行的单词chengliang,删除剩下部分,使用圆括号标识想保留的一部分。

[root@chengliang zcl]# echo "I am chengliang student." | sed 's#^.*am ([a-z] ) stu.*$#1#g' 
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#^.*am ([a-z] ) stu.*$#1#g'   
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#1#g'                   
am
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#12#g'
amchengliang
[root@chengliang zcl]# 

再来看个难点:请实行命令抽取linux中的eth0的IP地址?

[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p'
          inet addr:192.168.197.133  Bcast:192.168.197.255  Mask:255.255.255.0
[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#1#g'
192.168.197.133

也可以进行组合

[root@chensiqi1 ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#1#gp'
192.168.197.133 

命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

 

公司案例3:批量重命名文件

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

[root@chengliang test_1]# find ./ -name "*_finished.jpg"
./stu_102999_4_finished.jpg
./stu_102999_1_finished.jpg
./stu_102999_5_finished.jpg
./stu_102999_3_finished.jpg
./stu_102999_2_finished.jpg
[root@chengliang test_1]#

渴求用sed命令重命名,效果为:

stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished
mv - move (rename) files

解题思路:因为这是文本名,无法直接yongsed命令替换,由此还亟需依赖mv命令重命名

格式为:mv stu_102999_1_finished.jpg stu_102999_1.jpg. 大家须要拼凑那样的格式,然后使用bash命令施行就可以。

[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#12#g'
./stu_102999_4.jpg
./stu_102999_1.jpg
./stu_102999_5.jpg
./stu_102999_3.jpg
./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & 12#g' 
mv ./stu_102999_4_finished.jpg ./stu_102999_4.jpg
mv ./stu_102999_1_finished.jpg ./stu_102999_1.jpg
mv ./stu_102999_5_finished.jpg ./stu_102999_5.jpg
mv ./stu_102999_3_finished.jpg ./stu_102999_3.jpg
mv ./stu_102999_2_finished.jpg ./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & 12#g' | bash
[root@chengliang test_1]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg
[root@chengliang test_1]# 

一声令下表达:

  1. “1”代表前边“(^.*)”相配内容,“&”代表“s# #”里被轮换的内容,这里极其到的是欧洲经济共同体的文本名。
  2. 行使bash命令实施,bash命令实施标准输入的说话,就像大家在命令行输入语句后敲回车。

 

按行替换,这么些意义用的非常少,所以大家探听就可以。这里运用的sed命令是:
“c”:用新行替代旧行,回忆方法:c的全拼是change,意思是替换。

[root@chengliang zcl]# sed "2c wahaha" zcl.txt
101,chengliang,aa
wahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

一声令下表明:使用sed命令c将原先第2行 “102,alex,bb” 替换到“wahaha” , 整行替换

 

三、命令推行流程

Sed软件从文件或管道中读取一行,管理一行,输出一行;再读取一行,再管理一行,再出口一行....

叁遍一行的统一筹算使得sed软件品质相当高,sed在读取极其宏大的文件时不会晤世卡顿的想象。大家都用过vi命令,用vi命令张开几十M或越来越大的文本,会意识有卡顿现象,那是因为 style="color: #ff0000;">vi命令张开文件是二次性将文件加载到内部存款和储蓄器,然后再展开,由此卡顿的时长就在于从磁盘到内部存款和储蓄器的读取速度了。何况若是文件过大的话还恐怕会产生内部存款和储蓄器溢现身象。Sed软件就很好的幸免了这种场馆,张开速度极其快,实践进程也不慢。

幸存二个文书person.txt,共有五行文本,sed命令读入文件person.txt的第一行“101,chensiqi,老总”,并将那行文本存入形式空间(sed软件在内部存款和储蓄器中的一个有时缓存,用于寄放读取到的原委,比喻为工厂流水生产线的传递带。)

文本person.txt在方式空间的完好管理流程

  • 推断第1行是还是不是是需求管理的行,假使不是要拍卖的行就重新从文件读取下一行,要是是要管理的行,则跟着往下走。
  • 对方式空间的剧情推行sed命令,举个例子a(追加),i(插入),s(替换)...
  • 将格局空间中通过sed命令处理后的内容输出到荧屏上,然后清航空模型式空间
  • 读取下一行文本,然后再度实践上边的流水生产线,直到文件甘休

图片 1

sed是非交互式的编辑器。它不会修改文件,除非动用shell重定平昔保存结果。暗许情形下,全体的输骑行都被打字与印刷到显示器上。

sed编辑器逐行管理文件(或输入),并将结果发送到荧屏。具体经过如下:首先sed把当下正在管理的行保存在三个权且缓存区中(也称为情势空间),然后管理一时缓冲区中的行,实现后把该行发送到显示屏上。sed每处理完一行就将其从有时缓冲区删除,然后将下一行读入,举办拍卖和呈现。管理完输入文件的最后一行后,sed便甘休运维。sed把每一行都存在偶然缓冲区中,对那些别本进行编辑,所以不会修改最早的文章件。

 

Sed软件有多少个放置的累积空间:

  • 形式空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(这一个缓冲区是在内存中的),然后利用sed命令操作情势空间的剧情。
  • 维持空间(hold space):是sed软件其他二个缓冲区,用来寄存在有的时候数据,也是在内部存款和储蓄器中,不过情势空间和保全空间的用途是区别等的。Sed能够换来保持空间和方式空间的数额,可是不能够在维系空间上施行平日的sed命令,也便是说大家能够在保持空间存款和储蓄数据。

 

信用合作社案例2:钦定行修改配置文件

[root@chengliang zcl]# sed "3s#0#9#" zcl.txt
101,chengliang,aa
102,alex,bb
193,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令表明: 前边学习的例子在sed命令“s”前并没有一些名地方范围,由此暗中认可是对具备行开展操作。 而这么些案例供给只将第3行的0换来9,这里就用到了大家眼下学过的地点范围知识,在sed命令“s”前拉长“3”就代表对第3行实行替换

 

变量替换

变量替换其实和前面包车型客车文书替换是同样的,正是具体的文本形成了变量,同不常间要求大家对引号的用法要有观察众清的掌握.

[root@chengliang zcl]# cat > person.txt<<KOF 
> a
> b
> a
> KOF
[root@chengliang zcl]# cat person.txt
a
b
a
[root@chengliang zcl]# x=a
[root@chengliang zcl]# y=b
[root@chengliang zcl]# echo $x    ##-->设置变量x并 赋值a
a
[root@chengliang zcl]# echo $b

[root@chengliang zcl]# echo $y
b
[root@chengliang zcl]# 

不使用引号

[root@chengliang zcl]# sed s#$x#$y#g person.txt
b
b
b
[root@chengliang zcl]# sed 's#'$x'#'$y'#g' person.txt
b
b
b
[root@chengliang zcl]# sed 's#$x#$y#g' person.txt
a
b
a
[root@chengliang zcl]#
命令说明:表面看起来单引号是可以用的,但其实这里用了障眼法,在你们眼中分段‘$x’和'$y',但其实分段是‘s#’和‘#’和‘#g’,所以$x和$y并没有被引号扩起来,和上面的例子就一样了。

使用eval命令:

[root@chengliang zcl]# sed 's#$x#$y#g' person.txt  
a
b
a
[root@chengliang zcl]# eval sed 's#$x#$y#g' person.txt  
b
b
b
[root@chengliang zcl]# 

命令表明:这里给大家扩张七个Linux内置命令eval,那么些命令能读入变量,并将她们组合成多个新的指令,然后施行。首先eval会剖判变量$x和变量$y,最终完毕的效果和双引号是同样的

拓展: 最高效的拿走IP地址的点子

[root@chengliang zcl]# hostname -I 
192.168.179.133 
[root@chengliang zcl]# 

 

丰盛多行文本

-e     enable interpretation of backslash escapes    //启用反斜杠转义解释

[root@chengliang zcl]# echo "zcl";echo "zcl"
zcl
zcl
[root@chengliang zcl]# echo "zclnzcl"      
zclnzcl
[root@chengliang zcl]# echo -e "zclnzcl"
zcl
zcl
[root@chengliang zcl]# 

一声令下表达:这里就“n”派上用场了,行与行以内是以“n”作为分隔符的,所以“chensiqinchensiqi”就等效于2行chensiqi。接下来大家用echo命令实验一下,其中-e参数表示字符串中只要出现以下特殊字符(n代表换行,t代表Tab键等),则加以特殊管理,而不会将它便是日常文字输出。

[root@chengliang zcl]# sed "2a wawawanhahaha" zcl.txt
101,chengliang,aa
102,alex,bb
wawawa
hahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

自然还可能有另外一种艺术添增多行文本,但这种方法并不曾“n”方便,所以在这里间就回顾说一下。这种情势运用了“”,它也许有换行的意趣。倘若我们在实行一行不长的下令时候,假若都写在一行,那太无耻了也不便理解,因而就使用到了那些标识能够将一条完整的通令分成多行,举例:

[root@chengliang zcl]# echo my         
> name
> is 
> zcl
my nameis zcl
[root@chengliang zcl]# 

sed命令使用反斜线,首先输入完“sed '2a 106,dandan,CSO ”,然后敲回车键,那样窗口会展现三个标记“>”,大家在此个标识前面跟着写命令的剩余部分“107,bingbing,CCO‘ person.txt”。

[root@chengliang zcl]#  sed '2a 106,dandan,CSO 
> 107,bingibng,CCO'   
> zcl.txt
101,chengliang,aa
102,alex,bb
106,dandan,CSO 
107,bingibng,CCO
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

sed软件使用命令i插入多行文本和指令和a的用法是均等的,因而这里不再详细列出,大家能够练习一下

 

特殊符号=获取行号

[root@chengliang zcl]# sed '=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
4
104,laonanhai,dd
命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。

[root@chengliang zcl]# sed '1,3=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
104,laonanhai,dd
命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容

[root@chengliang zcl]#
[root@chengliang zcl]# sed '/alex/=' zcl.txt
101,Fuck,aa
2
102,alex,bb
103,eric,cc
104,laonanhai,dd
命令说明:只打印正则匹配行的行号,同时输出文件中的内容

[root@chengliang zcl]# sed -n '/alex/=' zcl.txt
2
命令说明:只显示行号但不显示行的内容即取消默认输出

[root@chengliang zcl]# sed -n '$=' zcl.txt
4
[root@chengliang zcl]# 
命令说明:“$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

艺术创新:

[root@chengliang zcl]# sed '=' zcl.txt | sed 'N;s#n# #'      
1 101,Fuck,aa
2 102,alex,bb
3 103,eric,cc
4 104,laonanhai,dd
[root@chengliang zcl]# 

  

sed如何取不再而三的行

[root@chengliang zcl]# sed -n "1p;3p;4p" zcl.txt
101,Fuck,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

特殊符号{}的施用

[root@chengliang zcl]# sed -n '2,3p;=' zcl.txt 
1
102,alex,bb
2
103,eric,cc
3
4
[root@chengliang zcl]# sed -n '2,3{p;=}' zcl.txt
102,alex,bb
2
103,eric,cc
3
[root@chengliang zcl]# 
  • 一声令下表明:-n去掉暗中认可输出,2,4p,输出2到4行内容,=输出全部的行的行号

  • 命令表达: ‘2,4{p;=}’代表统一输出2,4行的行号和剧情

 

参照他事他说加以考察博客:

 

特殊符号&代表被轮换的内容

那是二个特有技巧,在符合的情景使用特意方便。上边用特殊符号“&”与分组替换一齐行使,举办相比。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -r 's#(.*),(.*),(.*)#& ----- 1 2 3#' zcl.txt 
101,chengliang,aa ----- 101 chengliang aa
102,alex,bb ----- 102 alex bb
103,eric,cc ----- 103 eric cc
104,laonanhai,dd ----- 104 laonanhai dd
[root@chengliang zcl]# 

地方命令的&符号代表每一行,即模型中‘s#对象内容#轮换内容#g’的指标内容。

 

特殊符号~(步长)分析

格式:“First~step”表示从开始,以小幅step递增,那个在数学中称之为等差数列

例子:

  • 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@chengliang zcl]# seq 10 1 2 3 4 5 6 7 8 9 10 [root@chengliang zcl]# seq 10 | sed -n "1~2p" 1 3 5 7 9 [root@chengliang zcl]#

命令说明:seq命令能够转移从1到10的数字类别

一声令下说明:上边的一声令下重要表达特殊符号“~”的意义,别的sed命令用法n和p请见后文详解,大家只须求明白那一个命令能够将“1~2”钦点的行彰显出来就能够。

假设大家想生成奇数数列,其实上边的办法是为了比如,并非一个很好的点子,因为seq命令自带这种成效。

[root@chengliang zcl]# seq 1 2 10
1
3
5
7
9
[root@chengliang zcl]# 

命令表达:seq命令格式seq起初值 公差 甘休值

[root@chengliang zcl]# sed "1~2d" zcl.txt
102,alex,bb
104,laonanhai,dd
[root@chengliang zcl]# sed "1, 2d" zcl.txt
104,laonanhai,dd
[root@chengliang zcl]# 

指令表达:“1~2”那是钦命行数的另一种格式,从第1行开端以大幅2递增的行(1,3,5),因而删掉第1,3,5行,即全数的奇数行。

一声令下表明:那实在是做个加法运算,‘1, 2d’==>删除第1行到第3(1 2)行的文本。

[root@chengliang zcl]# sed '2,3!d' zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

命令表明:在地点范围“2,3”前边加上“ !”,假使不加“!”表示删除第2行和第3行,结果如下边包车型客车例证所示,然后加上“!”的结果便是除了第2行和第3行以外的剧情都剔除,这些方法能够当做显示文件的第2,3行难题的补给措施。

 

市廛案例1:优化SSH配置(一键成功增加多少参数

在我们上学CentOS6体系优化时,有七个优化点:改造ssh服务远程登入的布署。首要的操作是在ssh的布局文件/etc/ssh/sshd_config参预下边5行文本。

Port 52113    #ssh服务端口
PermitRootLogin no    #不允许root远程登陆
PermitEmptyPasswords no    #不允许密码为空
UseDNS no
GSSAPIAuthentication no

自然大家得以应用vi/vim命令编辑那几个文件,但是如此就比较费心,以后想用一条命令扩大5行文本到第13行前?

[root@chengliang ~]# 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

 

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划