前言
sed行编辑器
1.Linux中 sed 命令是利用脚本来处理文本文件,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
2.运行逻辑 Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象
默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。
语法
1.基础语法
sed [ ] 地址+脚本命令 文件名 或者标准输入
sed [-hnV][-e<script>][-e<script>][-f<script文件>][文本文件]
#参数说明:
-e<script>或--expression=<script>多点编辑 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
sed ' ' filename 查看文件内容
[root@sv1 ~]# sed '' 1111
hope in the future
支持重定向
[root@sv1 ~]# sed '' < 1111
hope in the future
2.脚本格式
sed !!#ffff00 ' ' !! 单引号中间需要写脚本
!!#ffff00 '地址+命令'!!组成
未指定地址,默认全文。
| 符号 |效果 |
| ------ | ------ |
|$ | 最后一行 |
| #,# | 从几行到几行如4,7 第4行 到第7行 |
| #,+# | 从第#行到#+#行 如3,+4 第3行到第7行 |
| \/ part1 \/,/ part2 / | 两个正则表达式之间 |
| #,/part/ | 从#号行开始找到 part为止如3,/^r 从第3行开始 找到r开头为止 |
| 步进 ~ | ru 1~2 从1开始步进2 就是奇数行 1 3 5 7 9…行 2~2 偶数行 |
常用动作说明
首先新建一个文件1111 方便实例 内容:
[root@sv1 ~]# cat 1111
hope in the future
JD
TaoBao
PDD
TianMao
Google
Vipshop
Suning
Amazon
!!#ffff00 p!! 打印当前模式空间内容,追加到默认输出之后 通常 p 会与参数 sed -n 一起运行
[root@sv1 ~]# seq 2 |sed 'p' #自带打印功能 p 又打印了一遍 就是两遍
1
1
2
2
[root@sv1 ~]#[root@sv1 ~]# seq 2 |sed -n 'p' #-n
1
2
[root@sv1 ~]# cat 1111 |sed -n '3p' #直接显示第三行
TaoBao
[root@sv1 ~]# cat 1111 |sed -n '$p' #直接显示最后一行
Amazon
[root@sv1 ~]# sed -n '/taobao/Ip' 1111#支持正则表达读取taobao不分大小写
TaoBao
!!#ffff00 a!!新增,后面可以接字串,字符串会在目前的下一行出现 支持使用\n实现多行追加
[root@sv1 ~]# sed '5ashop' 1111 #在第5行后增加shop
hope in the future
JD
TaoBao
PDD
TianMao
shop
Google
Vipshop
Suning
Amazon
!!#ffff00 d!! 删除模式空间匹配的行,并立即启用下一轮循环 d 后面通常不接任何内容
[root@sv1 ~]# seq 5 |sed '2d' #删除第二行
1
3
4
5
[root@sv1 ~]# seq 10 |sed '5,$d' #删除第5行到最后一行
1
2
3
4
!!#ffff00 s !!查找替换 可以搭配正则表达式 s/old/new/修饰符 修饰符通常有
g 行内全局替换
p 显示替换成功的行
I,i 忽略大小写
w /PATH/FILE 将替换成功的行保存至文件中
!!#ffff00 i!! 在行前面插入文本,目前行的上一行插入
[root@sv1 ~]# sed '5ishop' 1111 #在第5行前 插入shop
hope in the future
JD
TaoBao
PDD
shop
TianMao
Google
Vipshop
Suning
Amazon
!!#ffff00 c!! 替换行为单行或多行文本
!!#ffff00 w!! file 保存模式匹配的行至指定文件 会覆盖原文件的内容 。
[root@sv1 ~]# cat 1111
2
hope in the future
[root@sv1 ~]# seq 10 | sed -n '3w1111'
[root@sv1 ~]# cat 1111
3
!!#ffff00 r!! 读取指定文件的文本至模式间中匹配到的行后
[root@sv1 ~]# seq 5 | sed '4r 1111' #指定文件1111内容 在第4行后显示
1
2
3
4
hope in the future
JD
TaoBao
PDD
TianMao
Google
Vipshop
Suning
Amazon
5
!!#ffff00 =!! 为模式空间中的行打印行号
[root@sv1 ~]# sed '2=' 1111 #在文件中的第2行打印行号
hope in the future
2
JD
TaoBao
PDD
TianMao
Google
Vipshop
Suning
Amazon
!!#ffff00 ! !!模式空间中匹配行取反处理
[root@sv1 ~]# seq 10 |sed -n '1~5!p' #排除1 和 6 行
2
3
4
5
7
8
9
10
[root@sv1 ~]# seq 10 |sed -n '1~5p' #打印出1 和6行
1
6
!!#ffff00 q !! 结束或退出sed
[root@sv1 ~]# seq 10 |sed '1q' # 读取到第1行就结束退出
1
查找几点几分到几点几分之间的日志
[root@sv1 ~]# sed -n '/time/,/time/p'
#如:sed -n '/2020:16:08/,/2020:16:12/' *.log
搜索替代
基本格式:
s/old/new/g
建议修改配置文件的时,优先备份 sed -i.bak
[root@sv1 ~]# sed -i.bak 's/PDD/拼多多/g' 1111 #PDD替换成拼多多。
[root@sv1 ~]# cat 1111
hope in the future
JD
TaoBao
拼多多
TianMao
Google
Vipshop
Suning
Amazon
!!#ffff00 &!! 指代之前找到的内容
[root@sv1 ~]# sed 's/JD/&购物/g' 1111
hope in the future
JD购物
TaoBao
PDD
TianMao
Google
Vipshop
Suning
Amazon
分组 s//代表查找替换 ()代表分组 \1 代表留下的组
[root@sv1 ~]# echo 123abc456abc |sed -r 's/(123)(abc)(456)/\2/'
abcabc
[root@sv1 ~]# echo 123abc456abc |sed -r 's/(123)(abc)(456)/\3/'
456abc
[root@sv1 ~]# echo 123abc456abc |sed -r 's/(123)(abc)(456)/\1/'
123abc
分组提取IP地址
[root@sv1 ~]# ifconfig ens33 |sed -nr '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.100.101
提取对应文件里面的版本号
[root@sv1 ~]# cat 3333 | sed -r 's/.*-(.*)jar/\1/'
#按照字段 用正则表达式表示出来之后 进行分组 读取对应分组里面数据即可。