目录
频道首页
📚 三剑客之sed
收藏
0
xy20118 最近修改于 2024-05-17 13:53:20

前言

image

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 &nbsp; 忽略大小写
w &nbsp; /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

image

分组 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/'
#按照字段 用正则表达式表示出来之后 进行分组 读取对应分组里面数据即可。
内容大纲
批注笔记
📚 三剑客之sed
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板