一,说明
Sed 是一种在线,非交互式的编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
二,命令格式
Sed [options] 'command' file(s)
Sed [options] -f scriptfile file(s)
注:sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0
三,支持正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式和各种元字符,正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
使用基本元素字符集 ^, $, ., *, [], [^], <>, (), {}
使用扩展元字符集 ?, +, {}, |, ()
使用扩展元字符的方式
+ 使用转义
Sed -r 加-r
四,sed基本用法
Sed -rn 'p' passwd
-r 支持扩展元字符
-n 静默,意思为不显示默认行
如何不使用-n, sed -r 'p' passwd, 每行重复
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
Sed -r 's/root/alice/' passwd # 换每行第一个
Sed -r 's/root/alice/g' passwd # 全局替换
Sed -r 's/root/alice/gi' passwd # i忽略大小写
Sed -r '/root/d' passwd #删除字符
Sed -r '\crootcd' passwd #另一种写法
Sed -r '/\/etc\/abc/\/etc\/efg/' a.txt #替换,使用\转义
Sed -r '#/etc/abc#/etc/efg#' a.txt #另一种写法
五,sed扩展
定址
地址用于决定对哪些行进行编辑,地址形式可以是数字,正则表达式或二者的结合,如果没有指定地址,sed将处理输入文件中的所有行。
Sed -r 'd' passwd #删除所有
Sed -r '3d' passwd #删除第3行
Sed -r '1,3d' passwd #删除第1到3行
Sed -r '/root/d' passwd #删除包含有root字符串的行
Sed -r '/^admin/,20d passwd #从包含admin的行删除到第5行
Sed -r '/^admin/, +20d passwd #从包含admin的行后面再删除20行
Sed -r '/root/d' passwd #删除包含root的行
Sed -r '/root/!d' passwd #取反
Sed -r '1~2d' passwd #删除 所有奇数行
Sed -r '0~2d' passwd #删除所有偶数行
sed命令
六,命令示例
删除:d
Sed -r '3d' passwd
Sed -r '3,$d' passwd #删除第3行到最后一行
Sed -r '$d' passwd
替换:s
Sed -r 's/[0-9][0-9]$/&.5/' a.txt
&代表在查找串中匹配到的内容,这里&代表[0-9][0-9], 实现效果:在原来的匹配数字后加.5
Sed -r 's/(.)(.)(.*)/\1YYY\2\3/' a.txt #在第2个字母前加YYY
追加命令:a
Sed -r '2a\root' passwd #第2行后追加
插入命令:i
Sed -r '2i\root' passwd #第2行前插入
修改命令:c
Sed -r '2c\root' passwd #替换第2行
获取下一行:n
Sed -r '/admin/{n;s/sbin/uuu/}' passwd
查找匹配admin的下一行,并对下一行的sbin替换为uuu
Sed -r '/admin/{n;n;s/sbin/uuu/}' passwd
下下一行
Sed -r '/admin/{n;d}' passwd
查找匹配的admin的下一行,并对下一行进行删除
Sed -r 'g' passwd
模式空间和暂存空间
h:从模式空间覆盖到暂存空间 H:从模式空间追加到暂存空间
G: 从暂存空间追加到模式空间 g:从暂存空间覆盖到模式空间
Sed -r 'g' passwd
Sed -r 'G' passwd
暂存和取用命令:
Sed -r '1h;$G' passwd #第1行放到暂存空间,追加到最后一行后
Sed -r '1{h;d};$G' passwd #第1行放到暂存空间,再删除,追加到最后一行后
Sed -r '1h; 2,$g' passwd
第1行放到暂存空间,第2行到最后一行从暂存空间取出第1行数据
Sed -r '1h; 2,3H; $G' passwd
暂存空间和模式空间互换命令: x
Sed -r '4h;5x;6G' passwd
多重编辑: -e
Sed -r -e '1,3d' -e 's/root/aaa/' passwd
Sed -r '1,3d; s/root/aaa/' passwd
七, sed常见操作
删除配置文件中#号注释行
Sed -ri 's/^[ \t]*#/d' /etc/nginx/conf/nginx.conf
删除配置文件中//号注释行
Sed -ri '\Y^[ \t]*//Yd' file.conf
删除无内容空行
Sed -ri 's/^[ \t]*$/d' file.conf
删除#号注释行和空行
Sed -ri '/^[ \t]*#/d;/^[ \t]*$/d' file.conf
修改文件
Sed -ri '$a\chroot=YES' /etc/selinux/config
#最后一行追加,$代表最后一行
sed -ri '/^SELINUX=/cSELINUX=disabled/' /etc/selinux/config
替换以SELINUX开头的行
实现同样的效果
Sed -ri 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
取某个时间段的日志
命令格式: sed -n '/起始时间/','/结束时间/p' [日志文件]
n : 读取下一个输入行,用下一个命令处理新的行而不是第一个命令
p : 打印输出
sed -n '/2018-01-23 17:45:00/','/2018-01-23 17:55:00/p' access.log
用awk可以实现同样的效果
awk '/2018-01-23 17:45:00/','/2018-01-23 17:55:00/' access.log
给文件添加注释
Sed -r '2,6s/^/#/' a.txt
Sed -r '2,6s/(.*)/#\1/' a.txt
Sed -r '2,62/.*/#&/' a.txt
提取IP地址
ifconfig |awk 'NR==2'|awk '{print $2}'
NR 记录行数
ifconfig |sed -n '2p'|awk '{print $2}'
-n 静默,意思为不显示默认行
p 打印