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内置命令字符 | 描述 |
---|---|
a | append,追加,在指定行后面添加内容 |
d | delete,删除匹配的行 |
i | insert,插入,在指定行前插入文本 |
p | print,打印,打印匹配行的内容,通常于-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,表示追加
内置命令a
和i
都是针对内存中的数据,并不会保存到文件中
保存到文件-i
如果想要将sed操作的内容保存到文件中,则可以使用-i选项
练习
根据ifconfig命令和sed命令获取到本地ip地址
获取最近10分钟的日志内容
-
首先,我们得知道当前时间,然后计算出10分钟前的时间,比如现在是2023-3-3 16:41,那10分钟前的时间是2023-3-3 16:31
-
我们需要知道日志中的时间格式,我们可以使用tail命令查询最近的日志,根据日志确定了日志的时间格式是:Mar 3 16:31
-
因为sed命令过滤时是根据已有数据进行过滤的,所以我们需要确认Mar 3 16:31的数据是否在日志中存在,若存在则使用sed命令,不存在则上下调整时间,直到时间存在后就使用sed命令