day18--三剑客命令sed

day18–三剑客命令sed

一、课程回顾

二、sed命令

字符流编辑工具(行编辑工具):按照每行中的字符进行处理操作

全屏编辑工具:vi/vim

1.sed命令作用说明:

1)擅长对行进行操作处理

2)擅长将文件的内容信息进行修改调整/删除

​ 编写脚本:修改文件内容信息时,如修改网络服务中的IP地址:

​ 步骤一:vi ifcfg-eth0

​ 步骤二:重启网络服务

​ 步骤三:检查测试

​ 自动修改网卡地址脚本:

​ 步骤一:修改地址 sed -i ‘s#x#x#g’ ifcfg-eth0

​ 步骤二:重启网络服务 systemctl restart network

​ 步骤三:获取主机地址信息 echo “服务器修改后IP地址: $(hostname -i)" >> /zzx/zzxhostname.txt

2.具体功能作用

1)增
2)删
3)改
4)查(过滤)

3.sed语法

 sed [OPTION]... {script-only-if-no-other-script} [input-file]...
 命令	参数			条件-处理					处理文件信息
 显示出文件中有zzx行的信息
 sed -i				'/zzx/p'					zzx.txt

4.sed命令执行原理

将每一行依次放入内存的模式空间中,进行判断处理,默认输出(-n默认不输出)如遇到匹配的行,则输出。

放在内存中进行操作,不会真正对文件内容进行操作(-i将内存中的信息放到磁盘里,覆盖原文件)

5.sed实践操作

1)查询

可根据文件行号进行查询 或 根据文件内容进行查询:

操作根据文件行号查询根据文件内容查询
显示单行信息[root@zzxCentOS7 zzx]# sed -n ‘3p’ person.txt
103,Alex,COO
[root@zzxCentOS7 zzx]# sed -n ‘/zzx/p’ person.txt
101,zzx,CEO
输出多行信息(连续)[root@zzxCentOS7 zzx]# sed -n ‘1,3p’ person.txt
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
[root@zzxCentOS7 zzx]# sed -n ‘/zzx/,/Alex/p’ person.txt
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
输出多行信息(不连续)[root@zzxCentOS7 zzx]# sed -n ‘1p;3p’ person.txt
101,zzx,CEO
103,Alex,COO
[root@zzxCentOS7 zzx]# sed -n ‘/zzx/p;/Alex/p’ person.txt
101,zzx,CEO
103,Alex,COO
106,zzx,CAO**(sed原理)**
2)添加

在某行之前添加:

[root@zzxCentOS7 zzx]# sed -i 'i100,zxc,CCC' person.txt 				在每行之前都添加
[root@zzxCentOS7 zzx]# sed -i '1i100,zxc,CCC' person.txt 				1i表示在文件第1行之前。	-i表示将内存中信息写入磁盘
[root@zzxCentOS7 zzx]# cat person.txt 
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO

在某行之后添加

[root@zzxCentOS7 zzx]# sed -i '7a107,xxx,XXX' person.txt 				7a表示在第7行之后	
[root@zzxCentOS7 zzx]# cat person.txt 
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
107,xxx,XXX

在文件尾部添加

[root@zzxCentOS7 zzx]# sed '$a108,,,' person.txt 						$表示在文件尾部
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
107,xxx,XXX
108,,,

添加多行信息

[root@zzxCentOS7 zzx]#  sed '$a100\n200' person.txt 
100,zxc,CCC
......
107,xxx,XXX
100
200
[root@zzxCentOS7 zzx]# sed -e '/zzx/izzz' -e '/zzx/axxx' person.txt 	#在有zzx的行前加zzz,行后加xxx
100,zxc,CCC
zzz
101,zzx,CEO
xxx
......
zzz
106,zzx,CAO
xxx
107,xxx,XXX
总结:添加多行内容方法:
命令操作
vi
catcat >> xxx.txt <<EOF
>>…
>>EOF
echoecho -e xxx\naaa >> person.txt
sedsed -i ‘$axxx\nxxx’ person.txt
3)删除
[root@zzxCentOS7 zzx]# sed '1d' person.txt					删除第一行

[root@zzxCentOS7 zzx]# sed '1,5d' person.txt 				删除第1至5行

[root@zzxCentOS7 zzx]# sed -e '1d' -e '5d' person.txt 		 删除第一行和第五行
[root@zzxCentOS7 zzx]# sed '1d;5d' person.txt 

[root@zzxCentOS7 zzx]# sed '/zzx/d' person.txt 				删除含有zzx的行
100,zxc,CCC
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
107,xxx,XXX

练习:取消空行显示

sed '/^$/d' person.txt 						删除空行,显示

sed -n '/^$/!p' person.txt 					-n取消默认显示	!反选						

sed -n '/./p' person.txt 					.显示有内容的行
4)修改
sed 's#XXX#AAA#g' x.txt						

#可以替换为/,全部都换

后项引用前项

练习:利用sed命令取出有ip地址的行

[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'														#找出包含IP地址的行
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'							   #将IP地址之前的内容过滤
10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0

[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'	 #将IP地址之后的内容过滤
10.0.0.200

[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'						#简化合并,直接提取net~/24之间的内容
10.0.0.200

[root@zzxCentOS7 zzx]# ip a s eth0 |sed -rn '3s#^.*net (.*)/24.*#\1#gp'									求同存异,3表示第三行,中间操作,p输出
10.0.0.200
补充1:-in

执行 sed -i 命令并生成备份文件

[root@zzxCentOS7 zzx]# sed -i.bak 's#yyy#xxx#g' person.txt											# -i.bak 写入磁盘的同时生成备份
[root@zzxCentOS7 zzx]# ls
person.txt  person.txt.bak  person.txtn  zzx1  zzx1.txt  zzx.txt  zzx.txt.bak
[root@zzxCentOS7 zzx]# diff person.txt.bak person.txt
8c8
< 107,yyy,XXX
---
> 107,xxx,XXX
补充2:-ni

执行sed写入命令时,不能让n和i命令同时出现

[root@zzxCentOS7 zzx]# sed -ni 's#XXX#YYY#g' person.txt											ni同时出现,将会把显示的内容写入文件覆盖源文件
[root@zzxCentOS7 zzx]# cat person.txt
[root@zzxCentOS7 zzx]# ???
测试:修改后缀名

批量修改文件的扩展名,将.txt修改为.jpg

[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt"					                          #找出zzx*.txt文件					
/zzx/zzx2/zzx01.txt
/zzx/zzx2/zzx02.txt
/zzx/zzx2/zzx03.txt
[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt"|sed -r  's#(.*)txt#mv \1txt \1jpg#g'	    #将文件名替换为命令
mv /zzx/zzx2/zzx01.txt /zzx/zzx2/zzx01.jpg
mv /zzx/zzx2/zzx02.txt /zzx/zzx2/zzx02.jpg
mv /zzx/zzx2/zzx03.txt /zzx/zzx2/zzx03.jpg
[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt"|sed -r  's#(.*)txt#mv \1txt \1jpg#g'|bash	#bash执行
[root@zzxCentOS7 zzx2]# ls																			 #显示
zzx01.jpg  zzx02.jpg  zzx03.jpg  zzx04.jpg  zzx05.jpg  zzx06.jpg  zzx07.jpg  zzx08.jpg  zzx09.jpg  zzx10.jpg	
[root@zzxCentOS7 zzx2]# ls zzx*.txt | sed -r 's#(.*)txt#mv & \1jpg#g'|bash					#ls命令查找,&表示前一个命令的结果
[root@zzxCentOS7 zzx2]# ls
zzx01.jpg  zzx02.jpg  zzx03.jpg  zzx04.jpg  zzx05.jpg  zzx06.jpg  zzx07.jpg  zzx08.jpg  zzx09.jpg  zzx10.jpg

批量重命名命令:

rename 	.txt	.jpg	zzx*.txt
命令	  操作前	后		文件
补充3:c
[root@zzxCentOS7 zzx]# sed -i '8c111' person.txt.bak 			# c 整行替换
[root@zzxCentOS7 zzx]# cat person.txt.bak 
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
111
5)sed补充:sed更多用法
sed -n '/^$/!p' person.txt			#指定信息取反

sed '='person.txt					#取出文件行号
sed '='person.txt|xargs -n2			同行显示

sed -n '1p;3p;5p' person.txt		#执行多个相同指令

6.总结:sed指令信息

p print 输出

i insert 插入信息,在指定信息前插入新的信息

a append 附加信息,在指定信息后附加新的信息

d delete 删除

s substitute 替换

g global 全局

c 整行替换

7.总结:sed参数信息

-n 取消默认输出

-r 识别扩展正则

-i 将内存中的信息写入文件

-e 识别sed命令多个指令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值