18、shell编程之sed

RHCE板块

欢迎来到我的博客,这里是Linux板块,配合之前RHCSA进阶,希望我的博客可以帮助到您,感谢您的阅读,有什么问题还希望一起探讨交流,感谢各位的支持,感谢!

  1. 使用Linux搭建一个简单的论坛
  2. RHCE——一、安装部署及例行性工作
  3. RHCE——二、时间服务器
  4. RHCE——三、远程连接服务器
  5. RHCE——四、Web服务器(理论篇
  6. RHCE——五、Web服务器及内网穿透(实验篇
  7. RHCE——六、基于https协议的静态网站
  8. RHCE——七、搭建云存储器
  9. RHCE——八、DNS域名解析服务器
  10. RHCE——九、SELinux
  11. RHCE——十、防火墙、iptables、firewalld
  12. RHCE——十一、NFS服务器
  13. RHCE——十二、Mysql服务
  14. RHCE——十三、Shell自动化运维编程基础
  15. RHCE——十四、变量和引用
  16. RHCE——十五、shell条件测试
  17. RHCE——十六、流程控制之条件判断、循环
  18. RHCE——十七、文本搜索工具-grep、正则表达式
  19. RHCE——十八、shell编程之sed
  20. RHCE——十九、shell编程之awk
  21. RHCE——二十、Ansible及安装与配置
  22. RHCE——二十一、Ansible模块

一、概念

  • sed命令是一个非交互式的文本编辑器,是将一系列的编辑命令应用于一批文本的理想工具,可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本

  • sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间

  • Vim 采用的是交互式文本编辑模式,可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据

工作原理

  • 模式空间pattern space:sed在内存里开辟模式空间,处理文件的每个输入行,最多8192字节
  • 保留空间holding space:sed在内存里开辟保留空间,保存已经处理过的输入行,最多8192字节
  • 原理:sed 的工作流程主要包括读取、执行和显示三个过程:
    • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
    • 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
    • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空
    • 重复上述过程,直到将文件中所有数据处理完毕
  • 图:

image-20230206111953593

  • 注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出

二、基本语法

1、格式

sed  -参数  '[定址符]' '操作'  文件名

2、参数

  • -n,–quiet,–silent:安静模式,不输出模式空间中的内容,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来
  • -i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
  • -e:直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开,如:sed -e ‘command1;command2… filename 或者 sed -e ‘command1’ -e command2’ ……filename
  • -r:使用扩展正则表达式
  • -f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作
  • –help:显示帮助
  • –version:显示版本
  • -{} :可组合多个命令,以分号隔开

在这里插入图片描述

3、定址符

  • 用于使用数字指定处理的行区间,或者使用正则进行过滤
  • 表示方法
地址定界作用
1,5对文件的1-5行内容进行处理
2,$对文件的2到最后一行内容进行处理
1,+3对文件第1行以及以后的3行内容进行处理
1~2对文件的1,3,5,7,……的行内容进行处理
/正则表达式/对任何能够被正则表达式匹配到的行进行处理

4、操作

s:替换,替换指定字符,一般搭配正则表达式
d:删除,删除选定的行。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
a:增加(append),a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i:插入(insert),i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
c:行替换,指定行中的所有内容,替换成该选项后面的字符串。
y:字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
! :对指定行以外的所有行应用命令
& :代表匹配到的内容

三、输出文本

范例文件

[root@server ~]# vim  sed1.txt
one
two
three
four
five
six
seven
eight
nine
ten
[root@server ~]# sed  -n  'p'  sed1.txt  # 全文打印
[root@server ~]# sed  -n  '=;p'  sed1.txt  # 全文打印并显示行号,分号分割动作
[root@server ~]# sed  -n  -e '='  -e 'p'  sed1.txt  # 同上
[root@server ~]# sed  -n  'l'  sed1.txt  # 全文显示并输出控制字符
[root@server ~]# sed  -n  '   # 全文打印,交互模式
> =
> p
> ' sed1.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#定址符
[root@server ~]# sed  -n  '1p'  sed1.txt  # 打印第一行
[root@server ~]# sed  -n  '4,6p'  sed1.txt # 打印4-6行
[root@server ~]# sed  -n  '3,12p'  sed1.txt # 打印3-12行,超行范围只显示实际内容
[root@server ~]# sed  -n  '7,$p'  sed1.txt # 打印7到最后一行
[root@server ~]# sed  -n  '$p'  sed1.txt  # 打印最后一行
[root@server ~]# sed  -n  '2~2p'  sed1.txt # 打印偶数行
[root@server ~]# sed  -n  '1~2p'  sed1.txt # 打印奇数行
[root@server ~]# sed  -n  '4p;6p;8p'  sed1.txt # 打印4、6、8行
[root@server ~]# sed  -n  '1,+5p'  sed1.txt # 打印第1行及其后5行
[root@server ~]# sed  -n  '1!p'  sed1.txt  # 打印除了第1行的剩余行
[root@server ~]# sed  -n  '2,3!p'  sed1.txt # 打印除了2-3行的剩余行
[root@server ~]# sed  -n  '1~2!p'  sed1.txt #打印偶数行

在这里插入图片描述
在这里插入图片描述

#正则
[root@server ~]# sed  -n  '/^f/p'  sed1.txt  # 打印f开头的行
[root@server ~]# sed  -n  '/t/p'  sed1.txt  # 检索包含t的行
[root@server ~]# sed  -n  '/^t/p ; /^f/p'  sed1.txt  # 检索包含t开头或者包含f开头的行信息
[root@server ~]# sed  -n  '2,/five/p'  sed1.txt # 检索第2行到five所在行
[root@server ~]# sed  -n  '/n$/p'  sed1.txt # 检索n结尾的行信息

在这里插入图片描述

#规定语法
[root@server ~]# sed  -n  'n;p'  sed1.txt  # 检索偶数行
[root@server ~]# sed  -n  'p;n'  sed1.txt  # 检索奇数行
[root@server ~]# sed  -n  '$='  sed1.txt  # 打印文本的总行数

在这里插入图片描述

四、文本替换

1、范例文件

[root@server ~]# cp  /etc/passwd  ~/ps
[root@server ~]# cat ps
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
……
……

在这里插入图片描述

2、格式

sed  -参数  '行范围s/旧字符串/新字符串/替换标记'  文件名
  • 行范围:使用数字表示,即对第几行到第几行进行替换处理,若省略则表示进行全文处理
  • s: 替换动作
  • 替换标记
    • 数字:使用1-512之间的数字,表示指定需要替换的字符串出现第几次才进行替换
    • g:对数据中所有匹配到的内容进行替换,若省略g则只会对第一次匹配的内容进行替换
    • p:替换成功立刻打印,一般与-n一起使用
    • w 文件名 : 将缓冲区的内容写入到指定文件中
    • & : 使用正则表达式匹配的内容进行替换
    • \ :转义符,若有特殊符号或路径则需要转义

3、示例

[root@server ~]# sed  -n  's/root/boot/gp'  ~/ps  # 全文替换包含root为boot,
[root@server ~]# sed    's/root/boot/g'  ~/ps # 不加-n及动作p会显示未变化的和变化的行信息
[root@server ~]# sed  -n  's/root/admin/2p'  ~/ps  # 将每一行第二次出现的root替换为admin
[root@server ~]# sed  -n  's/root/admin/p'  ~/ps   # 将每一行第一个root替换为admin
[root@server ~]# sed -n '4s/adm/root/gp'  ~/ps # 将第4行的adm全文替换为root


# 注意:替换的内容及新字符串中有路径分隔符,为了与sed的斜杠分隔符区分开来,需要对路径分隔符/之前增加转义符
[root@server ~]# sed  -n  's/\/sbin\/nologin/\/bin\/bash/gp'  ~/ps
# 注意:若替换内容及新内容中有路径/符号,可以将sed自带的三个/更换成#
[root@server ~]# sed  -n  's#/sbin/nologin#/bin/bash#gp'  ~/ps
# 注意:由于上例,则sed自带三个/可以更换成#
[root@server ~]# sed  -n  's#root#boot#gp'  ~/ps
# 注意:若替换内容就是#时,sed自带三个/不能更换为#,下例报错
[root@server ~]# sed  -n  's###@#gp'  /etc/sos/sos.conf 
[root@server ~]# sed  -n  '$s/:/@/gp'  ~/ps   # 将最后一行的所有:替换为@

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@server ~]# sed  's/^/#/'  ~/ps  # 全文增加注释
# 查找结果中部分内容插入新内容
[root@server ~]# sed 's/SSH/&@/'  ~/ps # 在SSH右侧插入@    ,&代表SSH本体
[root@server ~]# sed 's/SSH/@&/'  ~/ps   # 在SSH左侧插入@
# 所有的行首及行尾添加@
[root@server ~]# sed  's/^/@&/g ; s/&$/@/g'  ~/ps
[root@server ~]# sed  's/^/@/g  ; s/$/@/g'  ~/ps
# 文本第一行之前插入空白行
[root@server ~]# sed  '1s/^/\n/'  ~/ps
# 最后一行插如空白行
[root@server ~]# sed  '$s/$/\n/'  ~/ps
# 全文所有小写字母改为大写字母,\u表示大写字母,不能写[A-Z]
[root@server ~]# sed  's/[a-z]/\u&/g'  ~/ps
# 全文所有大写字母改为小写字母,\L为小写字母
[root@server ~]# sed  's/[A-Z]/\L&/g'  ~/ps
# 单词首字母大写,\b确定单词边界即第一个字母
[root@server ~]# sed  's/\b[a-z]/\u&/g'  ~/ps

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 开启或关闭selinux
[root@server ~]# sed -i 's/SELINUX=disabled/SELINUX=enforcing/'   /etc/selinux/config 
# 或者
[root@server ~]# sed  -i  '22s/disabled/enforcing/'  /etc/selinux/config 
# httpd网页目录替换
[root@server ~]# yum  install  httpd -y
#xftp上传网页数据
[root@server ~]# sed  -i -e '124s/\/var\/www\/html/\/zy/'  -e '129s/\/var\/www/\/zy/'  /etc/httpd/conf/httpd.conf
[root@server ~]# systemctl start httpd
# 浏览器测试
# 修改bind
[root@server ~]# sed  -i -e 's/127.0.0.1/any/p'  -e 's/localhost/any/' /etc/named.conf 
# 支持管道符即输出重定向
[root@server ~]# echo  "china"  |  sed  's/[a-z]/\u&/'
China
[root@server ~]# echo  "china"  |  sed  's/[a-z]/\u&/g'
CHINA
[root@server ~]# echo  "china"  |  sed  's/[a-z]/\u&/g'  >  t1.txt
[root@server ~]# cat  t1.txt 
CHINA

在这里插入图片描述

4、使用替换实现删除

[root@server ~]# sed  -n  's/root//gp'  ~/ps  # 将全文root删除
# 删除全文注释
[root@server ~]# sed  -n 's/^#//p'  /etc/sos/sos.conf 

[root@server ~]# sed  -n  's/^.//p'  ~/ps  # 删除每一行第一个字符,^.表示第一个字符
[root@server ~]# sed  -n  's/.$//p'  ~/ps   # 删除每行最后一个字符
[root@server ~]# sed  -n  '5,10s/[0-9]//gp'  ~/ps  # 删除第5-10的所有的数字
# 删除所有特殊字符(除了数字、字母)另存为到文件t1.txt
[root@server ~]# sed  's/[^(a-z)(A-Z)(0-9)]//gw  t1.txt'   ~/ps # [^]表示不包含
[root@server ~]# cat t1.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、删除文本

1、注意

  • d操作用于删除文本的特定行,会删除指定的所有内容,则使用该命令必须特别小心,若忘记指定处理行的话会删除所有内容,也不会有任何输出
# 会清空文件中所有内容
[root@server ~]# sed  -i  'd'  ps
[root@server ~]# cat  ps

2、示例

# 准备示例文件
[root@server ~]# cp  /etc/sos/sos.conf  ~/sos.conf

在这里插入图片描述

[root@server ~]# sed  '1d' sos.conf   # 删除第1行
[root@server ~]# line_number=2
[root@server ~]# sed  "${line_number}d"  sos.conf   # 变量作为行号,需要使用双引号
[root@server ~]# sed  '/^$/d' sos.conf   # 删除全文的空白行
[root@server ~]# sed  '/Options/d' sos.conf  # 删除Options的所在行
# 多个删除条件的写法:
[root@server ~]# sed  -e  '/Options/d'  -e  '/options/d'  sos.conf 
[root@server ~]# sed  '/Options/d ; /options/d'  sos.conf 
[root@server ~]# sed  -e '/Options/d' sos.conf | sed '/options/d'  sos.conf 
[root@server ~]# sed  '/3/,/5/d'  sos.conf  # 删除包含3到包含5的所有行
[root@server ~]# sed  '/^\[/d'  sos.conf   # 删除[开头的行,需要转义
[root@server ~]# sed  '/^#/d'  sos.conf   # 删除注释行,但是为整行删除
# 注意:删除时先不要加-i写回源文件,否则无法恢复

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、插入文本

1、注意

  • 使用a动作在文本最后追加一行,使用i动作在指定行前插入一行,两者格式相同

2、格式

sed  '行范围a(或i)\新文本'   文件名

3、示例

[root@server ~]# sed -i '$a\192.168.48.130  www.openlab.com'  /etc/hosts
[root@server ~]# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.130  www.openlab.com
[root@server ~]# sed  -i  '3i\192.168.48.131  www.openlab.com'  /etc/hosts
[root@server ~]# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.131  www.openlab.com
192.168.48.130  www.openlab.com
[root@server ~]# sed  -i  '/131/i\192.168.48.132  www.openlab.com'  /etc/hosts
[root@server ~]# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.132  www.openlab.com
192.168.48.131  www.openlab.com
192.168.48.130  www.openlab.com

4、注意

  • sed命令是基于数据流的处理命令,若文件内容为空,无法插入数据
[root@server ~]# touch  t2.txt
[root@server ~]# cat  t2.txt
[root@server ~]# sed  -i  '$a\xiaoming 18 98.5'  t2.txt
[root@server ~]# cat  t2.txt
[root@server ~]# cat  t2.txt
[root@server ~]# sed  -i  '1i\xiaoming 18 98.5'  t2.txt
[root@server ~]# cat  t2.txt

七、练习

示例:把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
1、打印test.txt的3到10行;
2、打印test.txt 中包含’root’的行;
3、删除test.txt 的15行以及以后所有行;
4、删除test.txt中包含’bash’的行;
5、替换test.txt 中’root’为’toor’;
6、替换test.txt中’/sbin/nologin’为’/bin/login’
7、删除test.txt中5到10行中所有的数字;
8、删除test.txt 中所有特殊字符(除了数字以及大小写字母);
9、在test.txt 20行到末行最前面加’aaa:’
10、在test.txt所有行首增加#注释
# 打印4-8行
# 打印第3行及其下2行
# 打印中包含null的行
# 打印第5行到sshd所在行的内容
# 将全文的替换adm替换为admin
# 将全文的/bin/bash替换为/usr/bin/sh
# 将1-5行的单词第一个字母大写
# 在第5行之前插入一个空白行
# 安装bind,将/etc/named.conf的2项参数替换为any
# 删除所有的冒号
# 在最后一行之后添加一个空白行 
# 删除root所在行
# 在第一行之前插入一条信息记录,内容自定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值