RHCE---shell脚本编程sed


前言

Liunx中筛选文本时常用的命令,常常会被提及文本三剑客,前文我们学习了文本三剑客中的grep 命令,除了grep命令我们也常用到sed命令,sed命令有着grep命令独有的功能!


一.概述

   sed 是一种流编辑器,用于在文本流中进行操作。它可以用来进行文本替换、文本删除、文本提取和文本转换等任务。sed 将输入文本作为流处理,并可以对其进行修改,然后将修改后的文本输出到标准输出或将其重定向到文件中。  

工作原理

sed 的工作流程主要包括读取、执行和显示三个过 程:

  • 读取:sed 从输入流(文件、管道、标准输入)中读取 一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
  • 执行:默认情况下,所有的sed 命令都在模式空间中顺 序地执行,除非指定了行的地址,否则sed 命令 将会 在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模 式空间将会被清空 重复上述过程,直到将文件中所有数据处理完毕

  • 模式空间:sed在内存里开辟的空间,处理文件的每个输入行
  • 保持空间:保存处理过的输入行(将第一行的处理结果保存到该空间后继续处理第二行)
  •                   将所有行处理结束后,再将保留空间的内容写入硬盘
  • 临时缓冲区:模式空间
  • 二.sed命令

  • 格式:
  • sed  -参数  '[定址符]' '操作' 文件名

    参数:

  • -n :一般配合行号使用,使用-n后,仅显示被处理的行
    -i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
    -e:对文本进行多个动作时,使用-e将动作分开执行
    -r:使用扩展正则表达式
    -f:类似于输出重定向符号,直接将sed动作写入一个文件内
    -{} :可组合多个命令,以分好隔开

    定址符:

  • 用于指定sed命令处理的行范围

  • 1,5:对文件的1-5行内容进行处理
    2,$:对文件的2到最后一行内容进行处理
    1,+3:对文件第1行以及以后的3行内容进行处理
    1~2:对文件的1,3,5,7,……的行内容进行处理
    /正则表达式/:对任何能够被正则表达式匹配到的行进行处理
    

    操作:

  • 增删改查 执行增删改查等动作

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

    三.案列

  • 使用 n .=.p 打印

  • [root@server ~]# sed -n '=;p' sed1.txt 
    #打印文件中所有内容,并显示行号 
    #分号;用于将操作命令串联使用 
    #-e 作用和分号相同 格式为 -e '操作' -e '操作'

  • [root@server ~]# sed -n '1p' sed1.txt
    #打印第一行
    one
  •      数字,数字 

  • [root@server ~]# sed -n '3,9p' sed1.txt 
    # 打印3-9行
    three
    four
    five
    six
    seven
    eight
    nine

    2,$

  • :对文件第7行到最后一行进行处理

  • [root@server ~]# sed -n '7,$p' sed1.txt 
  •  1~2:

  • 对文件的1,3,5,7,……的行内容进行处理
[root@server ~]# sed -n '2~2p' sed1.txt 
#从第2行开始以2为步长打印偶数行

  •  !

  • :对指定行以外的所有行应用命令
[root@server ~]# sed -n '1!p' sed1.txt 
#打印除了第1行的剩余行信息
  •  分号;

  • 将操作串联
[root@server ~]# sed -n '4p;6p;8p' 
# 打印4 6 8行

 1,+3:

  • 对文件第1行以及以后的3行内容进行处理
[root@server ~]# sed -n '1,+2p' sed1.txt
#打印第一行及以下2行

 

 /正则表达式/

[root@server ~]# sed -n '/^f/p' sed1.txt 
# 以正则条件检索行并打印
#打印以f开头的行 定址符/正则表达式/ 使用正则表达式为条件筛选行并打印(p)

 

[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 'p;n' sed1.txt 
# 奇数行
#特殊结构n;p 打印偶数行 p;n 打印奇数行 $= 显示行数

 四.文本替换

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

文本替换

  • # 替换所有的root为boot
[root@server ~]# sed 's/root/boot/gp'   ps  #p:仅显示处理过的结果
#g:对文中匹配的内容进行全部替换,不加g表示仅替换找到内容中第一个匹配到的目标
#提换每一行第一个root为admin
[root@server ~]# sed -n 's/root/admin/p' ps

 

  • #替换每一行的第2个root为admin 
[root@server ~]# sed -n 's/root/admin/2p' ps

  •  # 将/sbin/nolgin 替换为 /bin/bash
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/gp' ps
#由于sed替换命令中自带/格式,当替换的文本中包含/代表路径时需要加转义符\
#为了方便查看,简化命令为:
[root@server ~]# sed -n 's#/sbin/nologin#/bin/bash#gp' ps
#注意:替换内容含有#时不可用此格式
  • 替换httpd文件中的文件访问路径 
[root@timeserver /]# sed -n '124s/\/var\/www\/html/\/zy/p' /etc/httpd/conf/httpd.conf 
[root@timeserver /]# sed -n '129s/\/var\/www/\zy/p' /etc/httpd/conf/httpd.conf

  •  全文行首增加#号
[root@timeserver ~]# sed -n 's/^/#/p' ps
 使用取地址符号 & 
  •  找到文本中的ssh并在左侧添加#号
[root@timeserver ~]# sed -n 's/ssh/#&/p' ps
#操作符:&代表匹配到的内容 上述命令中& 代表 匹配到的ssh
#  #&:在ssh左侧添加#
  •  行首行尾添加内容
[root@timeserver ~]# sed -n 's/^/@&/p;s/$/@&/p' ps
  •  将空白行添加到第一行
[root@timeserver ~]# sed '1s/^/\n/' ps
#/n 代表转译字符:换行
  •  将全文所有小写字母改为大写字母
[root@timeserver ~]# sed 's/[a-z]/\u&/gp' ps 
#sed 查询命令中,只有替换文本位置可识别正则表达式,结果位置不可识别
#\u:代表大写字母 不具有一般性,只针对sed命令的结果位置
#&:代表启动正则
  •  将单词的首字母改为大写
[root@timeserver ~]# sed  's/\b[a-z]/\u&/g' ps
# /b:正则表达式中的边界字符,用于匹配单词首部

通过查找内容为空实现删除部分内容 

  •  将全文的root删除
[root@timeserver ~]# sed -n 's/root/ /gp' ps
  •  删除每行第一个字符
[root@timeserver ~]# sed -n 's/^.//p' ps
# ^.:代表每第一个字符 .:代表匹配任意一个字符、
#.$:表示最后一个字符
  •  删除所有特殊字符(除了大小写字母),将结果写入到t1.txt
[root@timeserver ~]# sed 's/[^(a-z)(A-Z)(0-9)]//gw t1.txt' ps 

 五.文本删除

  • 删除第一行 
[root@timeserver ~]# sed '1d' sos.conf
#删除2-5行:1改为2,5
  •  定义变量删除行
[root@timeserver ~]# line_number=1
[root@timeserver ~]# sed "${line_number}d" sos.conf
#单引号中的内容会原样输出,$提取变量的作用会在单引号中失效,因此需要使用双引号
  •  删除空白行
[root@server ~]# sed '/^$/d' sos.conf 
  •  将包含Options的整行删除
[root@server ~]# sed '/Options/d' sos.conf
  •  将包含3到包含5的行删除
[root@server ~]# sed '/3/ , /5/d' sos.conf 

六.插入文本

格式

[root@server ~]# sed -i '3i\192.168.48.131 wwwopenlab.com'   hosts
sed  '行范围a(或i)\新文本'   文件名
  •  在行尾插入一行
[root@server ~]# sed -i '$a\192.168.48.132 www.openlab.com'   hosts

 


总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北 染 星 辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值