第1章 sed基础
第1章 sed知识点
不六柱预测对后悔的Linux三剑客之sed实战精讲
原文:
1.1 sed介绍
-
sed——流编辑器(stream
editor) -
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.5 sed命令总括图
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 引号的界别计算
-
双引号:把双引号的始末输出出来;假诺情节中有指令,变量等,会先把命令,变量解析出结果,然后再出口最后内容来。双引号内命令或变量的写法为`一声令下或变量`或$(命令或变量)
-
单引号:所见即所得,将单引号内的情节原样输出,阻止所有字符的转义
-
不加引号:不会将涵盖空格的字符串视为一个完完全全出口,即便情节中有发号施令,变量等,会先把命令,变量解析出结果,然后再出口末了内容来,即使字符串含有空格等特殊字符,则不可能完整输出,则需改加双引号。
-
倒引号(反引号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 |