ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux三剑客-SED

2019-02-19 09:04:07  阅读:265  来源: 互联网

标签:oldboy sed luffy 001 SED Linux txt root 三剑客


1、Sed是什么

Sed:字符流编辑器,Stream Editor

2、Sed功能与版本

处理日志文件,日志,配置文件等

增加、删除、修改、查询

sed --version 可以通过man sed 来检验系统中有没有安装sed

[root@luffy-001 ~]# 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.

 

3、语法格式

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

sed   -i.bak ‘s#oldboy#oldgirl#g’  oldboy.txt

-i  --sed命令的参数

s  --sed命令/指令

g  ------小尾巴/修饰

4、命令执行流程

模式空间:sed从文件读取一行文本后存入缓存区(这个缓存区在内存中)

5、常用功能

查询

创建测试文件

cat>person.txt<<EOF
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

按行查询

-n 取消默认输出

# #1、显示某一行,单行
[root@luffy-001 oldboy]# sed -n '1p' person.txt 
101,oldboy,CEO
# #如果没有‘1p’,默认会显示所有内容
# #2、显示连续多行
[root@luffy-001 oldboy]# sed -n '2,4p' person.txt 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
# #3、显示包含oldboy的行到包含104的行
# #先看包含oldboy的行,记住要使用斜线//包起来
[root@luffy-001 oldboy]# sed -n '/oldboy/p' person.txt 
101,oldboy,CEO
# #显示包含oldboy的行到以104开头的行(只用了特殊符号)
[root@luffy-001 oldboy]# sed -n '/oldboy/,/^104/p' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@luffy-001 oldboy]#
# #4、 查询制定更多行,通过分号隔开
[root@luffy-001 oldboy]# sed -n '2p;4p' person.txt 
102,zhangyao,CTO
104,yy,CFO

 

 

过滤多个字符

-r  sed选项,支持扩展正则表达式(|、()),默认情况,sed只支持基本正则表达式

sed里面的正则字符左右必须要用“/”。

sed命令通过正则表达式进行过滤========相当于egrep

 

[root@luffy-001 oldboy]# egrep 'oldboy|yy' person.txt 
101,oldboy,CEO
104,yy,CFO

[root@luffy-001 oldboy]# sed -rn '/oldboy|yy/p' person.txt 
101,oldboy,CEO
104,yy,CFO

 

增加

单行增加

a   追加append,在指定行后面添加一行或者多行文本

i    插入insert,在指定行前面添加一行或者多行文本

 

 

# 在第三行后面增加
[root@luffy-001 oldboy]# sed '3a 103.5,Lee,UFO' person.txt  
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
103.5,Lee,UFO
104,yy,CFO
105,feixue,CIO
# 在第三行前面增加
[root@luffy-001 oldboy]# sed '3i 103.5,Lee,UFO' person.txt  
101,oldboy,CEO
102,zhangyao,CTO
103.5,Lee,UFO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
# 查看文件并没有被修改
[root@luffy-001 oldboy]# cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
# $表示最后一行
[root@luffy-001 oldboy]# sed -n '$p' person.txt 
105,feixue,CIO
# 在最后一行加入一行内容new、new、new
[root@luffy-001 oldboy]# sed '$a new,new,new' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
new,new,new
# echo >> 也可以在文件最后追加单行

 

 

多行增加

# 在最后加上多行(不常用,有其他方法)
[root@luffy-001 oldboy]# sed '$a new,new,new\nold,old,old,old\nwww' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
new,new,new
old,old,old,old
www
# 使用cat命令向文件追加多行
cat >>person.txt<<EOF
new,new,new
old,old,old,old
www
EOF

 

 

删除

单行删除

[root@luffy-001 oldboy]# sed '$d' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

 

多行删除

[root@luffy-001 oldboy]# sed '2,3d' person.txt 
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '1,4d' person.txt 
105,feixue,CIO

 

不显示文件中的空行

[root@luffy-001 oldboy]# cat -n person.txt 
     1    101,oldboy,CEO
     2    
     3    102,zhangyao,CTO
     4    103,Alex,COO
     5    
     6    104,yy,CFO
     7    
     8    105,feixue,CIO
[root@luffy-001 oldboy]# cat -nA person.txt 
     1    101,oldboy,CEO$
     2    $
     3    102,zhangyao,CTO$
     4    103,Alex,COO$
     5    $
     6    104,yy,CFO$
     7    $
     8    105,feixue,CIO$
[root@luffy-001 oldboy]# grep -v '^$' person.txt   使用grep,去反
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '/^$/d' person.txt    使用sed(正则)删除空行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed -n '/^$/!p' person.txt   ! 表示去反
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@luffy-001 oldboy]# sed '$d' person.txt     删除最后一行
101,oldboy,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

[root@luffy-001 oldboy]# sed '$!d' person.txt   删除不是最后一行的所有行
105,feixue,CIO
[root@luffy-001 oldboy]# 

 

替换

sed  -i   ‘s###g’   person.txt

-i 修改文件   -i.ori 表示自动备份(先备份在修改)

s 单独使用---->  将每一行匹配的字符进行替换

g 每一行全部替换----> sed指令s的替换标志之一(全局替换)

如何用sed进行变量替换

###将变量中的内容进行替换(只要考察单双引号的区别)
#设置变量
[root@luffy-001 oldboy]# x=oldboy
[root@luffy-001 oldboy]# y=oldgirl
[root@luffy-001 oldboy]# 
#替换 使用 符号$
[root@luffy-001 oldboy]# sed 's#$x#$y#g' person.txt 
101,oldboy,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

105,feixue,CIO
#必须要使用双引号
[root@luffy-001 oldboy]# sed "s#$x#$y#g" person.txt 
101,oldgirl,CEO

102,zhangyao,CTO
103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

单引号:所见即所得

双引号:与单引号类似,特殊符号会被解析 $  $()  `` !

反向引用

()的功能可以记住正则表达式的一部分

扩展正则,使用 -r

\1 应用第一个小括号中的匹配内容,\2引用第二个小括号中的内容,sed最多可以记住9个

题目:ehco "i am oldboy teacher" 如果想保留这一行的单词oldboy

 

扩展

特殊符号 = 获取行号

[root@luffy-001 oldboy]# sed = person.txt 
1
101,oldboy,CEO
2

3
102,zhangyao,CTO
4
103,Alex,COO
5

6
104,yy,CFO
7

8
105,feixue,CIO

 

一条sed 语句至此那个多条命令

每个 -e 选项后可以接一个sed指令

分号的使用

案例:一个文件100行,把5,35,70行单独拿出来

 

标签:oldboy,sed,luffy,001,SED,Linux,txt,root,三剑客
来源: https://www.cnblogs.com/yxiaodao/p/10395917.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有