RHCE——十八、shell编程之sed

news2025/1/11 14:49:15

RHCE

  • 一、概念
    • 工作原理
  • 二、基本语法
    • 1、格式
    • 2、参数
    • 3、定址符
    • 4、操作
  • 三、输出文本
    • 范例文件
  • 四、文本替换
    • 1、范例文件
    • 2、格式
    • 3、示例
    • 4、使用替换实现删除
  • 五、删除文本
    • 1、注意
    • 2、示例
  • 六、插入文本
    • 1、注意
    • 2、格式
    • 3、示例
    • 4、注意
  • 七、练习

一、概念

  • 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右侧插入@
[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&/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 # [^]表示不包含

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

五、删除文本

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所在行
# 在第一行之前插入一条信息记录,内容自定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[keil] uv编译分析

假设Keil安装路径: C:\Keil_v5\ 假设工程在 d:\HELLO , 工程Targets名:Simulator [在Manage Project Items中可修改] 如下指令为:Build(F7) C:\Keil_v5\UV4\UV4.exe -b d:\HELLO\Hello.uvproj -j0 -t Simulator -o d:\HELLO\uv4.log 如下指令为:Rebuild(CtrlAltF7) C:\Kei…

PEX装机

目录 一、PXE是什么? 二、PXE的组件: vsftpd/httpd/nfs tftp dhcp 三、配置vsftpd 四、配置tftp 1.安装tftp-server 2.启动tftp 五、准备pxelinx.0文件、引导文件、内核文件 1.准备pxelinux.0文件 2.准备引导文件、内核文件 六、配置dhcp …

【基础建设】浅谈企业网络安全运营体系建设

引言 在网络安全环境复杂又严峻的当前,国内各大企业已开始组建自己的网络安全团队,加强企业自身安全能力建设,朝着网络安全运营一体化迈进。但企业安全运营也已逐步从被动式转变为主动式,成为将人、管理与技术结合,全…

C高级day1 shell 指令的补充学习

使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 2.思维导图

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

前言 首先,热烈祝贺家姐申请到了国家自然科学基金(8月底),找一些化学领域的程序和软件,助我姐一臂之力,顺便自己研究一下源码。 卟啉类化合物的结构分析 PorphyStruct,一种用于分析不同卟啉类非…

tlog实现链路追踪

tlog实现链路追踪 TLog通过对日志打标签完成企业级微服务的日志追踪。它不收集日志,使用简单, 产生全局唯一追踪码。除了追踪码,TLog还支持SpanId和上下游服务信息 标签的追加。你还可以自定义方法级别的标签,让日志的定位轻而易…

春秋云镜 CVE-2017-5638

春秋云镜 CVE-2017-5638 S2-045/S2-046 靶标介绍 2.3.32 之前的 Apache Struts 2 2.3.x 和 2.5.10.1 之前的 2.5.x 中的 Jakarta Multipart 解析器在文件上传尝试期间具有不正确的异常处理和错误消息生成,这允许远程攻击者通过精心制作的内容执行任意命令-Type、C…

Mysql 流程控制

简介 我们可以在存储过程和函数中实现比较复杂的业务逻辑,但是需要对应的流程控制语句来控制,就像Java中分支和循环语句一样,在MySQL中也提供了对应的语句,接下来就详细的介绍下。 1.分支结构 1.1 IF语句 IF 表达式1 THEN 操作1…

亚信科技AntDB数据库携“U8C+AntDB联合产品”亮相“2023全球商业创新大会”,开启生态合作新篇章

8月18-19日,近万人齐聚上海国家会展中心,带着对数字化、数智化趋势和热点的关注,以满腹热情投身到以“数据驱动 智能运营”为主题的“2023全球商业创新大会”,共商新技术条件下企业信息化出现的新课题、新挑战,共享数智…

【MQTT接收数据写入数据库】

MQTT接收数据写入数据库 1.搭建MQTT服务器 参考上一篇文章 2.安装数据库mysql sudo apt update sudo apt install mysql-server创建一个数据库和数据表存储mqtt消息 首先,登录到MySQL服务器: mysql -u root -p输入你的root用户密码。默认root 3.创…

Json字符串内容比较-超实用版

背景 之前有类似接口diff对比,数据对比的测试需求,涉及到json格式的数据对比,调研了几个大神们分享的代码,选了一个最符合自己需求的研究了下。 说明 这个对比方法,支持JsonObject和JsonArray类型的数据对比&#x…

攻防世界-crypto-工业协议分析2

打开附件得到 尝试直接搜索flag关键字,未果 发现存在关于ARP、UDP、SNA协议的流量包,仔细分析后发现大量的UDP包大小都一样,只有少量的是不同的,一个一个找下去,发现如下包有异常字符: 提取字符串&#xff…

MyBatis: 向oracle表中插入null字段的处理

一、可以在SQL中指定类型: Insert("insert into student values(#{name},#{age})")二、可以进行全局配置(单独使用MyBatis时可如下配置) 如果不进行配置,将报错

移动安全测试框架-MobSF WINDOWS 环境搭建

安装python python-3.11.5-amd64.exe 安装Win64OpenSSL-3_1_2.exe 安装VisualStudioSetup.exe github下载安装包 https://github.com/MobSF/Mobile-Security-Framework-MobSF/archive/refs/heads/master.zip GitHub - MobSF/Mobile-Security-Framework-MobSF: Mobile Secur…

【Apollo】自动驾驶技术的介绍

阿波罗是百度发布的名为“Apollo(阿波罗)”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

2023年软件测试常见面试题

测试花费的成本,要深入在那个环节上,(前提准备上,需求理解上,业务逻辑,排错上,业务名词上理解,通过什么样的方法,有谁能解决这样的问题) 软性热身题 1.自我…

Matlab图像处理-高斯低通滤波器

高通滤波 图像的边缘、细节主要位于高频部分,而图像的模糊是由于高频成分比较弱产生的。高通滤波就是为了高消除模糊,突出边缘。因此采用高通滤波器让高频成分通过,消除低频噪声成分削弱,再经傅里叶逆变换得到边缘锐化的图像。 …

C语言基础(下)

结构体 结构体类型的声明 结构体是一些值得集合,这些值称为成员变量。结构体得每个成员可以是不同类型得变量。 语法:struct tag{member-list;}variable-list;创建方法一:(普通创建) struct Stu {char name[20];char…

在Windows配置PPPoE连接

PPPoE(Point-to-Point Protocol over Ethernet)是一种常用的网络接入方式,广泛应用于家庭宽带、企业互联网等场景。本文将为您提供详细步骤和示例来指导如何在Windows操作系统上进行PPPoE连接的设置与配置。 1. 打开网络和共享中心 首先&…

关于在ts中使用最新版redux的方法记录

1.首先在react-ts项目中引入redux&react-redux npm i --save redux react-redux 2.redux文件及目录建设 3.文件说明 Store.ts:为入口文件 reducers: 为多个reducer独立文件,并且每个reducer都设置自己的类型注解文件 代码展示如下:…