一、sed简介:
Sed(Stream EDitor)是一个强大而简单的文本解析转换工具可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
Sed是从文件或管道中读取一行,处理一行,直到最后一行。与vim编辑器相比,打开和执行的速度更快。
二、工作流程:
- 读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
- 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
三、sed命令格式:
1.格式:
sed 【选项】 '操作' 文件..
2.常用选项:
-e | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f | 表示用指定的脚本文件来处理输入的文本文件 |
-i | 修改目标文本文件立即生效 |
-n | 仅显示script处理后的结果 |
3.常用操作:
参数 | 作用 |
---|---|
a | 增加,在当前行后面加一行指定内容 |
c | 替换,将选定行替换为指定内容 |
d | 删除,删除选定的行 |
i | 插入,在选定行前面插入一行指定内容 |
p | 打印,输出指定行 |
s | 替换,替换指定字符、格式:“行范围 s/旧字符串/新字符串” |
y | 字符转换 |
r | 指定读取文件 |
= | 打印行号 |
q | 退出 |
四、sed用法:
1.打印:
1.1 全部打印:
sed '' /etc/passwd #自动打印全部内容
sed -n ' ' /etc/passwd #关闭自动打印
sed -n 'p' /etc/passwd #关闭自动打印全部内容,p打印指定行(不指定行号默认打印全部)
1.2 打印指定行:
sed -n '1p' 1.txt #打印第一行
sed -n '1,3p' 1.txt #打印1到3行
sed -n '1p;5p' 1.txt #打印第1第5行
sed -n '1~2p' 1.txt #从1开始步长为2 奇数行
sed -n '0~2p' 1.txt #从0开始步长为2 偶数行
sed -n '0~3p' 1.txt #从0开始步长为3
sed -n '$p' 1.txt #打印最后一行
sed -n '3q' 1.txt #打印到第3行退出
1.3 打印搜索行:
sed -n '/^root/p' passwd #打印以root开头的行
sed -n '/bash$/p' passwd #打印以bash结尾的行
sed -n '/[0-9]/p' passwd #打印含有数字的行
sed -n '/nologin$/!p' passwd #不打印以onlogin结尾的行
sed -n '/root/=' passwd #打印含有root的行号
sed -n '/root/=;/root/p' passwd #打印行号和内容
sed -n '$=' passwd #统计总行数
1.4 应用扩展正则表达式:
sed -nr '/^root|^shutdown/p' passwd
#默认不支持扩展正则表达式,需要加-r选项
2.插入:
2.1
sed '2a qwe' 1.txt #打印不生效
sed -i '5a qwe' 1.txt #直接执行,5行后插入qwe
sed -i '2,4a qwe' 1.txt #2和4插入qwe
sed -i '/root/a hello' passwd #搜索行插入 hello
3.删除:
3.1 删除搜索行:
sed -i '/qwe/d' 1.txt
3.2 删除指定行:
sed -i '2,4d' 1.txt #删除2和4行
sed -i '/^$/d' 1.txt #删除空行
sed -i.bak '2d' 1.txt #删除前备份
4.替换:
sed -i '2c5' 1.txt #会替换一整行
5.搜索替换:
sed -n 's/root/ROOT/gp' passwd
sed -n '1,3s/^/#/gp' passwd
sed -n 's/\/sbin\/nologin/wzw/gp' passwd
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#修改selinux开机自启
6.分组:
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p'
#sed默认不支持正则表达式加r开启正则表达式匹配