32、sed命令详解
32.1、sed介绍:
1、sed(sed软件常称做)是流编辑器,是操作、过滤、和转换文本内容的工具;
2、sed的模式空间和保持空间介绍:
(1)模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间;
1)模式空间命令:
-n:清空当前的模式空间,然后读入下一行;
-N:不清空当前的模式空间,然后读入下一行
2)模式空间中的内容为:
1\n101,oldboy,CEO
2\n102,zhangyao,CTO
(2)保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,
而是需要sed命令来进行处理(了解即可);
(3)模式空间与保持空间的关系:
1)模式空间:相当于流水线,文本行在模式空间中进行处理;
1)保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,
但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
32.2、语法格式:
sed [option] [sed-commands] [input-file]
sed [选项] [sed命令] [输入文件]
sed 可以从管道中获取文件
sed 处理文件的流程(串行的处理):
、
32.3、sed选项:
-n:标准化输出,只取包含内容的值,通常连"p"一同使用,常用于打印匹配的内容,
否则不匹配的内容也会显示出来(grep匹配自带此功能),只能和-r参数同时使用;
-r:正则表达式规则,只能用于分组替换;
-i:修改文件,只能和-r参数同时使用,且使用时没有输出;
32.4、sed命令:
1、指定sed执行的地址范围:
(1)数字范围:
10{sed-commands} #对第十行进行操作;
10,20{sed-commands} #对第十行到20行进行操作;
10,+20{sed-commands} #对第10行到30行进行操作;
1~2{sed-commands} #奇数行,步长为2;2~2#偶数行;
1~${sed-commands} #第一行到最后一行;
(2)正则匹配:
/oldboy/{sed-commands} #匹配字符串操作;
/oldboy/,/Alex/{sed-commands} #匹配指定的字符串到指定的字符串
(3)两者混合:
1,/oldboy/{sed-commands} #匹配行数和字符串操作;
2、命令参数:
a:追加文本到指定的行后
i:插入文本到指定的行后
d:删除指定的文本或指定的行;
s#源值#替换值#g
s #代表替换指定的字符串;
g #代表命令的替换标志——全局替换标志;
# #表示定界符,也可以使用"/",但是不好区分,最好是使用"#",方便区分;
进行全局字符串匹配的替换
c:替换 ,不常用,了解;
[root@centos6 ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
32.5、sed命令操作:
以下的操作都是在sed模式空间中进行,不会对磁盘上的文件进行实际的操作;
sed的模式空间即是,sed在内存中分配的缓存空间;
1、追加:
(1)单行追加:
[root@centos6 ~]# sed '2a 106,dandan,CSO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行追加:
[root@backup scripts]# sed '2a 106,dandan,CSO\n107,dandan1,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,dandan1,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed '2a 106,dandan,CSO\
> 107,dandan1,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,dandan1,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
2、插入:
(1)单行插入:
[root@centos6 ~]# sed '2i 106,dandan,CSO' person.txt
101,oldboy,CEO
106,dandan,CSO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行插入:
[root@backup scripts]# sed '2i 106,dandan,CSO\n107,dandan1,CEO' person.txt
101,oldboy,CEO
106,dandan,CSO
107,dandan1,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
3、删除:
(1)单行删除:
[root@centos6 ~]# sed '2d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行删除:
[root@backup scripts]# sed '2,3d' person.txt
101,oldboy,CEO
104,yy,CFO
105,fcixuc,CIO
4、替换:
替换标志: g:全局标志;数字标志:1 2 3 4;写标志:w;忽略大小写标志:i ;bash 执行标志:e
(不加参数代表每一行)s# # #(不加参数表示第一个字符,g代表整行的字符) :代表对每一行的第一个字符进行匹配替换;
(1)替换文本内容:
1)全局替换:
[root@centos6 ~]# sed '2s#zhangyao#lc#g' person.txt
101,oldboy,CEO
102,lc,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
2)非全局替换:
Ms# # #Ng
# Ms g 对第二行进行全部替换;
[root@backup scripts]# sed "2s#1#0#g" num.txt
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
1 1 1 1 1
#Ms 对第二行的第一字符进行匹配替换;
[root@backup scripts]# sed "2s#1#0#" num.txt
1 1 1 1 1
0 1 1 1 1
1 1 1 1 1
1 1 1 1 1
#s 对全局的每行的第一个字符进行匹配替换;
[root@backup scripts]# sed "s#1#0#" num.txt
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
#Ms Ng 对第2行从第2处以后的内容进行匹配替换;
[root@backup scripts]# sed "2s#1#0#2g" num.txt
1 1 1 1 1
1 0 0 0 0
1 1 1 1 1
1 1 1 1 1
#Ms N 对第2行从第2处进行匹配替换;
[root@backup scripts]# sed "2s#1#0#2" num.txt
1 1 1 1 1
1 0 1 1 1
1 1 1 1 1
1 1 1 1 1
#忽略大小写’i‘参数;
[root@backup scripts]# sed 's#ce#lc#g' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed 's#ce#lc#ig' person.txt
101,oldboy,lcO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)替换变量:
[root@backup scripts]# vim sed.txt
a
b
a
[root@backup scripts]# x=a
[root@backup scripts]# y=b
[root@backup scripts]# echo $x $y
a b
#需要使用双引号,因为单引号是所见即所得,不能够使用变量;
[root@backup scripts]# sed "s#$x#$y#g" sed.txt
b
b
b
(3)分组替换\(\) \1...\9 :
把全局中取到第一行的oldboy替换成取到的oldboy值;
[root@backup scripts]# vim sed1.txt
i am oldboy teacher
i am oldboy teacher
[root@backup scripts]# sed -r '1s#^.*am ([a-z].*) tea.*$#\1#g' sed1.txt
oldboy
i am oldboy teacher
[root@backup scripts]# sed -nr '1s#^.*am ([a-z].*) tea.*$#\1#gp' sed1.txt
oldboy
#特殊符号&代表被替换的内容:
[root@backup scripts]# sed -r '1,3s#(.*)#--&--#g' person.txt
--101,oldboy,CEO--
--102,zhangyao,CTO--
--103,Alex,COO--
104,yy,CFO
105,fcixuc,CIO
(4)sed的大小写替换方式:
1)参数说明:
\u \U:大写;\l \L:小写;\E:和前面的参数一起使用,代表关闭L\l,U\u的功能;
2)应用实例:
[root@backup scripts]# sed "s#oldboy#\Ulc#g" person.txt
101,LC,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed "s#oldboy#\LLC#g" person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed "s#oldboy#\L\ELC#g" person.txt
101,LC,CEO #LC还是大写的,没有将LC转化为小写,因为使用\E参数;
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
5、标准化输出(查询):
(1)只显示匹配的内容 -n p
[root@backup scripts]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
(2)打印奇数行:
[root@backup scripts]# sed -n '1~2p' person.txt
101,oldboy,CEO
103,Alex,COO
105,fcixuc,CIO
(3)sed模拟cat命令:
[root@backup scripts]# sed '' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(4)sed模拟grep命令:
1)普通模拟:
[root@backup scripts]# sed -n '/oldboy/ p' person.txt
101,oldboy,CEO
2)模拟grep -v:
[root@backup scripts]# sed -n '/oldboy/ !p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(5)模拟head命令:
[root@backup scripts]# sed -n '1,2p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
[root@backup scripts]# sed '2q' person.txt #读取到第二行是停止;
101,oldboy,CEO
102,zhangyao,CTO
(6)sed命令模拟wc命令:
[root@backup scripts]# sed -n '$=' person.txt
5
(7)显示空和末尾,以$符号进行显示:
[root@backup scripts]# sed -n 'l' person.txt
101,oldboy,CEO$
102,zhangyao,CTO$
$
103,Alex,COO$
104,yy,CFO$
105,fcixuc,CIO$
6、sed的其它用法:
(1)修改文件时进行源文件的备份:
[root@backup scripts]# sed -i.bak 's#oldboy#lc#g' person.txt
[root@backup scripts]# cat person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# cat person.txt.bak
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)把文件修改后的内容另存为:
此方法可以使用-n -p -i -i.ori 选项;
[root@backup scripts]# sed 's#oldboy#lc#g;w ouput.txt' person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# cat ouput.txt
101,lc,CEO
备注:
此方法可以对文件进行备份:
sed 'w ouput.txt' person.txt
(3)等于(=)号:
[root@backup scripts]# sed '=' person.txt
1
101,oldboy,CEO
2
102,zhangyao,CTO
3
103,Alex,COO
4
104,yy,CFO
5
105,fcixuc,CIO
#以上的形式不好看,所以改变方式为:
[root@backup scripts]# sed '=' person.txt | sed 'N;s#\n# #g'
1 101,oldboy,CEO
2 102,zhangyao,CTO
3 103,Alex,COO
4 104,yy,CFO
5 105,fcixuc,CIO
[root@backup scripts]# sed '1,2=' person.txt | sed 'N;s#\n# #g'
1 101,oldboy,CEO
2 102,zhangyao,CTO
103,Alex,COO 104,yy,CFO
105,fcixuc,CIO
(4)合并两个文件:
[root@backup scripts]# sed '$r num.txt' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
#在person.txt的第二行后面插入mum.txt的所有内容;
[root@backup scripts]# sed '2r num.txt' person.txt
101,oldboy,CEO
102,zhangyao,CTO
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(5)一条sed语句执行多条sed命令:
#删除第三行到末尾的内容,并将第一行的oldboy替换成lc;
[root@backup scripts]# sed '3,$d;1s#oldboy#lc#g' person.txt
101,lc,CEO
102,zhangyao,CTO
7、企业案例:
(1)对ssh进行优化:
sed -i '13i Port 52113\nListenAddress 172.16.1.61:52113\nPermitRootLogin no\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/ssh_config
(2)删除某一个字符或查询一个字符串,完全匹配字符串;
[root@backup scripts]# cat a.txt
oldboy
lc
#'/\<oldboy\>/'表示一个文本中单行内只有该字符串,可以匹配多个;/var/ 同样适用于grep;
[root@backup scripts]# sed -i '/\<oldboy\>/d' a.txt
[root@backup scripts]# sed -n '/\<oldboy\>/p' a.txt
(3)修改selinux的值:
sed -i `s#SELINUX=enforcing#SELINUX=disabled#g` /etc/selinux/config
sed -i `7s#enforcing#disabled#g` /etc/selinux/config
(4)批量重命名文件:
[root@backup test]# f=4e5a725a_finished.html
[root@backup test]# mv $f `echo $f | sed 's#_finished.html#.jpg#g'`
[root@backup test]# cat c23.sh
#!/bin/sh
for f in `ls /server/scripts/test/*.html`; do
mv $f `echo $f | sed "s#_finished.html#.jpg#g"`
if [ $? -ne 0 ]; then
echo $f >>/tmp/error.log
fi
done
(5)linux启动选项优化:
[root@backup scripts]# chkconfig --list | grep 3:启用 | egrep -v "sshd|crond|network|rsyslog|sysstat" | awk '{print $1}' | sed -r 's#(.*)#chkconfig \1 off#ge' # |base
#g参数可以不加,表示匹配每一行的第一个字符;
(6)一个文件100行,把5,35,70行拿出来用一条命令;
[root@backup scripts]# sed -n '5p;35p;70p;' /etc/services
# IANA services version: last updated 2009-11-10
qotd 17/tcp quote
whois++ 63/udp
(7)把上行和下行的内容用“=”连接;
[root@backup scripts]# vim svn.txt
stu1\n
1\n
stu2\n
2\n
stu3\n
3\n
stu4\n
4\n
stu5\n
5\n
[root@backup scripts]# sed 'N;s#\n#=#g' svn.txt
stu1=1
stu2=2
stu3=3
stu4=4
stu5=5
32、sed命令详解的更多相关文章
- Linux学习之sed命令详解
概述 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区 ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- 【转】【Linux】sed命令详解
sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...
- 转 linux之sed命令详解
http://jingyan.baidu.com/article/fec4bce2228f60f2618d8bb0.html sed 编辑裁剪文件命令 sed -i "s/\/db\/te ...
- sed命令详解 (转载)
sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...
- Linux shell sed 命令详解
详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761 sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在 ...
- 【文本处理命令】之sed命令详解
sed行处理命令详解 一.简介 sed命令是一种在线编辑器.一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的,它一次处理一行内容.处理时,把当前处 ...
- linux sed命令详解
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- sed命令详解
搜索 纠正错误 添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...
随机推荐
- Zabbix 自动发现并监控磁盘IO、报警 引言
引言 Zabbix并没有提供模板来监控磁盘的IO性能,所以我们需要自己来创建一个,由于一台服务器中磁盘众多,如果只有一两台可以手动添加,但服务集群达到几十那就非常麻烦,因此需要利用自动发现这个功能,自 ...
- 010.Ansible_palybook 循环语句
Ansible循环语句 1 简介 我们在编写playbook的时候,不可避免的要执行一些重复性操作,比如指安装软件包,批量创建用户,操作某个目录下的所有文件等.正如我们所说,ansible一门简单的自 ...
- 基于Centos 7.4 搭建ELK整合SpringBoot日志收集
基于Centos 7.4搭建es7.12.0+logstash-7.12.0+kibana-7.12.0(ELK)整合SpringBoot日志收集 注:Skywalking和logstash可共用一个 ...
- 9.10 nohup:用户退出系统进程继续工作
nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端. 无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out文件 ...
- BXL文件怎样转换为AD LIB文件
https://jingyan.baidu.com/article/48b558e326e1b17f39c09a57.html
- 10.2-3 ifup&ifdown:激活与禁用网络接口
ifup:激活网络接口 ifup 和 ifdown 命令用于激活指定的网络接口.ifup命令其实是一个Shel脚本,有Shel基础的读者可以使用which命令来找到这个脚本并读一读.命令可读取 ...
- 《Java架构师的最佳实践》生产环境JVM调优之空间担保失败引起的FullGC
1 问题现象 应用prod-xxx-k8s,在内存足够的情况下,仍然会产生偶发FullGC的问题. JVM配置如下: -Xmx8192m -Dhsf.server.max.poolsize=2500 ...
- C语言编程 菜鸟练习100题(51-60)
[练习51]矩阵转置 0. 题目: 矩阵的转置 1. 分析: 练习使用 for 循环嵌套,多维数组的表达. 2. 程序: #include <stdio.h> int main() { i ...
- Jmeter+Ant+Jenkins接口自动化框架
最近应公司要求,搭建一套接口自动化环境.看到通知邮件,没有多想就确定了Jmeter路线.可能有些人会 说,为啥不用python,相对而言高大上一些.因为公司内部现在项目有用到Jmeter,正好可以结合 ...
- Celery 架构组成
Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async task)和定时任务(cron ...