Linux命令之sed

sed,Stream Editor(字符流编辑器)的缩写,简称流编辑器,是操作、过滤、转换文本内容的工具。
常用功能包括结合正则表达式对文件实现快速的增删改查。

工作原理

sed有2个空间来缓存数据,paattern space(模式空间)和hold space(保留空间)。sed工作时:

  • 步骤1:将待处理文本读入一行,去掉尾部换行符,存入paattern space,按照sed命令对文本进行编辑
  • 步骤2:如果sed命令没有-n参数,则把pattern space打印出来(加上换行符,因为步骤1去掉了换行符),如果有-n参数,判断当前的读入行内容是否有处理过,有处理过的则打印,没有处理过的不打印
  • 步骤3:把pattern space内容给到hold space,然后pattern space清空
  • 步骤4:如果文本未到末尾,换下一行重复步骤1;如果文本已处理到末尾,则结束。

工作原理引用了这篇文章:
sed的工作原理(pattern space 和 hold space)

使用

语法

sed命令的语法:sed [选项] [sed内置命令字符] [输入文件]

选项:

参数选项描述
-n取消默认sed的输出,即不符合处理规则的行不会输出,常与命令p一起使用
-i将修改结果写入文件(因为sed是将文本内容读入内存处理的,处理后的内容还是在内存中,未写入文件)
-e如果对文本有多次(超过1次)编辑,每一个处理中加上这个选项,就用不到管道符了
-r支持正则扩展

sed内置命令字符用于对文本进行指定的操作:

sed内置命令字符描述
aappend,追加,在指定行后面添加内容
ddelete,删除匹配的行
iinsert,插入,在指定行前插入文本
pprint,打印,打印匹配行的内容,通常于-n一起使用
s/正则表达式/替换内容/g将正则匹配到的内容进行替换,结尾的g(global)代表全局匹配

sed也可以指定处理范围(即按照指定规则选取匹配的行):

范围描述
空地址即如果没有指定处理范围的话,默认全文处理
单地址即某个数值,表示只处理某一行
/pattern/被模式匹配到的每一行
num1,num2从第num1行(包含)开始处理,到num2行(包含)结束,如果想到文本末尾结束,则num2可以设置为$,比如3,$表示从第3行到文本末尾
num1, +num2从第num1行(包含)开始处理,向下处理num2行(即总共处理num2行的数据)
num1~num2从第num1行(包含)开始到文本末尾,隔num2行的行文本进行处理,比如1~2表示1、3、5、7…行,即num2表示间隔数

实践

在实践时,我们先了解下内置命令字符p和选项-n

指定内容打印

如果我们指定行的时候,打印时需要使用内置命令字符p,但是默认情况下sed会将不符合规则的内容也打印处理,如果不打印不符合规则的内容,则需要加上-n
在这里插入图片描述

打印指定行

sed可以指定处理范围(即按照指定规则选取匹配的行):

范围描述
空地址即如果没有指定处理范围的话,默认全文处理
单地址即某个数值,表示只处理某一行
/pattern/被模式匹配到的每一行
num1,num2从第num1行(包含)开始处理,到num2行(包含)结束,如果想到文本末尾结束,则num2可以设置为$,比如3,$表示从第3行到文本末尾
num1, +num2从第num1行(包含)开始处理,向下处理num2行(即处理num1到num1+num2行,总共处理num2+1行的数据)
num1~num2从第num1行(包含)开始到文本末尾,隔num2行的行文本进行处理,比如1~2表示1、3、5、7…行,即num2表示间隔数

在这里插入图片描述
文本末尾的使用:
在这里插入图片描述

删除行

我们可以使用sed的内置关键字d去删除匹配的行(只是内存中的行删除了,文本中的没有删除)
在这里插入图片描述

替换内容

我们可以通过sed "s/正则表达式/替换内容/g" xxx对匹配到正则表达式的内容进行替换(在内存中替换,不会保存到文本中)
在这里插入图片描述
"s/正则表达式/替换内容/g"中,/可以用其他英文符号来表示,比如"s@正则表达式@替换内容@g"等等
在这里插入图片描述

多次编辑-e

一般情况下,我们可能对文本有多次的处理,除了使用|外,我们可以使用sed的-e选项来进行多次处理,一次-e对应一个处理逻辑。
在这里插入图片描述

追加a和插入i

  • 如果想在某一行前面(前一行)加内容,可以使用内置命令i,insert,表示插入
  • 如果想在某一行后面(下一行)加内容,可以使用内置命令a,append,表示追加

内置命令ai都是针对内存中的数据,并不会保存到文件中
在这里插入图片描述

保存到文件-i

如果想要将sed操作的内容保存到文件中,则可以使用-i选项
在这里插入图片描述

练习

根据ifconfig命令和sed命令获取到本地ip地址

在这里插入图片描述

获取最近10分钟的日志内容

  1. 首先,我们得知道当前时间,然后计算出10分钟前的时间,比如现在是2023-3-3 16:41,那10分钟前的时间是2023-3-3 16:31

  2. 我们需要知道日志中的时间格式,我们可以使用tail命令查询最近的日志,根据日志确定了日志的时间格式是:Mar 3 16:31
    在这里插入图片描述

  3. 因为sed命令过滤时是根据已有数据进行过滤的,所以我们需要确认Mar 3 16:31的数据是否在日志中存在,若存在则使用sed命令,不存在则上下调整时间,直到时间存在后就使用sed命令
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值