目录
一、sed的基本概念
1、sed是什么?
2、sed编辑器的工作流程
3、sed命令的基本用法
4、sed脚本格式
二、利用具体操作,进一步熟悉sed
1、打印内容
1.1 打印全部内容
1.2 查看文件,打印全部内容
1.3 打印指定行内容
编辑1.4 打印指定多行内容
1.5 打印多行后退出
1.6 打印最后一行,使用通配符$
1.7支持正则表达式,打印范围内容
1.8 过滤关键字
1.9 '#,/关键字/p 从第#行开始匹配 、
1.10 '/关键字/,#' 找到第#个关键字为止
1.11 打印文本的奇数和偶数行
2、删除内容
2.1 删除指定行
2.2 删除指定多行
编辑2.3 删除文本中的空行
2.4 删除以指定字符结尾的行及取反
编辑 2.5 先备份内容再删除
3、插入内容
3.1 在指定行后插入
4、替换内容
5、取反(使用感叹号!)
6、搜索替换
6.1 修改selinux开机不自启配置文件
6.4 查找几点到几点之间的日志
7、分组调用
7.1 调用分组段
7.2 提取IP地址
sed 的工作流程主要包括读取、执行和显示三个过程:
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,
除非是用重定向存储输出或者sed -i。
格式:
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
常用选项:
-n | 不输出模式空间内容到屏幕,即不自动打印 |
-e | 多点编辑 |
-f | 从指定文件中读取编辑脚本 |
-r,-E | 使用扩展正则表达式 |
-i.bak |
备份文件并原处编辑 |
常用操作:
操作 | 作用 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面增加一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
Y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。 |
= | 打印行号 |
l(小写L) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
单引号中间需要写脚本;脚本格式如下
'地址+命令'组成
1. 不给地址:对全文进行处理(比如行号)
2. 单地址:#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
#,# #从#行到第#行,3,6 从第3行到第6行
#,+# #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间的行#,/pat/ 从#号行为开始找到 pat为止
/pat/,# 找到#号个pat为止
4. 步进:~
1~2 奇数行
2~2 偶数行
sed ' ' #交互模式输入一行,自动打印一行相同的
sed -n ' ' #交互模式输入一行,关闭自动打印
sed -n ' p' #加上p又恢复自动打印,与sed ' '相同
sed ' ' /etc/fatab
sed -n ' p' /etc/fatab
sed -n '3p' /etc/fstab
#打印第三行内容
ifconfig ens33 |sed -n '2,4p'
#打印网卡信息的2至4行
cat -n /etc/passwd |sed -n '2,+4p'
#打印第2至6行,即第二行开始往后四行
sed '3q' /etc/passwd
#打印三行后退出
sed -n '$p' /etc/passwd
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
#sed -n '/^b/,/^f/p' /etc/passwd
### 基本格式 '/表达式1/,/表达式2/p' (不要忘记打印)p 文件名
[root@localhost ~]#sed -n '/root/p' /etc/passwd
##将包含root的行打印出来 /root(需要匹配的内容)/p(打印) 文件名
###与 grep root /etc/passwd 功能相同
sed -n '2,/root/p' /etc/passwd
#从第二行开始,找到root为止
sed -n '/root/,3p' /etc/passwd
#找到第三个root位置
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
cat 1.txt |sed '3d'
#删除第三行并显示出来
sed '2,4d' seq.txt
#删除连续的2到4行
sed '/^$/d' /opt/seq.txt
sed '/d$/!d' ./2.txt
#删除不是以d结尾的行
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份
sed -i '2a 3' 1.txt
#在第二行后插入内容
3.2 插入空行,修改文件的换行,要多加一个\
sed -i '2a\\n2' 1.txt
sed -i '2ctihuan' 1.txt
#将第二行的内容替换成tihuan
seq 10|sed -n '2!p'
#不显示第二行
格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表明新字符串将替换第几处匹配的地方
g : 表明新字符串将会替换所有匹配的地方
p : 打印与替换命令匹配的行,与 -n 一起使用
w 文件 :将替换的结果写到文件中
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
6.2 修改多行,使用r 以及-e
sed -ri -e 's/SELINUX=disabled/SELINUX=enabled/' /etc/selinux/config -e 's/SELINUXTYPE=targeted/SELINUXTYPE=111/' /etc/selinux/config
6.3 修改全局,后面加g
sed -i 's/root/admin/g' /etc/passwd
#将全局出现的root修改为admin
sed -n '/2023:08:09/,/2023:09:42:37/p' access_log
#分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
#调用第2个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
#调用第1个和第二个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\'
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p'