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 old,old,old,old www' 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行单独拿出来