1 sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。
2 sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
格式:sed [选项] '条件指令' 文件.. ..
sed命令可以使用行号或正则做为条件匹配,条件可以为空代表匹配所有
-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(让sed支持扩展正则)
-i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
1 sed工具的p指令案例集锦(查)
[root@svr5 ~]# sed -n 'p' a.txt //输出所有行,等同于cat a.txt
[root@svr5 ~]# sed -n '4p' a.txt //输出第4行
[root@svr5 ~]# sed -n '4,7p' a.txt //输出第4~7行
[root@svr5 ~]# sed -n '4,+10p' a.txt //输出第4行及其后的10行内容
[root@svr5 ~]# sed -n '/^bin/p' a.txt //输出以bin开头的行
[root@svr5 ~]# sed -n '$=' a.txt //输出文件的行数(看文件最后一行的行号 “=” 表示显示行号)
[root@svr5 ~]# sed -n '/root/=' /etc/passwd //显示有root存在的行号
[root@svr5 ~]# sed -n '/$/=' /etc/passwd //打印所有行号。
2 sed工具的d指令案例集锦 (删)
[root@svr5 ~]# sed '3,5d' a.txt //删除第3~5行
[root@svr5 ~]# sed '/xml/d' a.txt //删除所有包含xml的行
[root@svr5 ~]# sed '/xml/!d' a.txt //删除不包含xml的行,!符号表示取反
[root@svr5 ~]# sed '/^install/d' a.txt //删除以install开头的行
[root@svr5 ~]# sed '$d' a.txt //删除文件的最后一行
[root@svr5 ~]# sed '/^$/d' a.txt //删除所有空行
3 sed工具的s指令案例集锦:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径
[root@svr5 ~]# sed 's/xml/XML/' a.txt //将每行中第一个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/3' a.txt //将每行中的第3个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/g' a.txt //将所有的xml都替换为XML
[root@svr5 ~]# sed 's/xml//g' a.txt //将所有的xml都删除(替换为空串)
[root@svr5 ~]# sed 's#/bin/bash#/sbin/sh#' a.txt //将/bin/bash替换为/sbin/sh
[root@svr5 ~]# sed '4,7s/^/#/' a.txt //将第4~7行注释掉(行首加#号)
[root@svr5 ~]# sed 's/^#an/an/' a.txt //解除以#an开头的行的注释(去除行首的#号)
[root@svr5 ~]# sed 's9\97\98\99\9\98\99' a.txt ## 将97989更换为9989
[root@svr5 ~]# sed 's/2017/xxxx/' test.txt //将每行中第一个2017替换为xxxx : 内存中修改
[root@svr5 ~]# sed 's/2017/xxxx/g' test.txt //将所有的2017替换为xxxx : 内存中修改
[root@svr5 ~]# sed 's/2017/xxxx/2' test.txt //将每行中的第二个2017替换为xxxx :内存中修改
[root@svr5 ~]# sed 's/2017//2' test.txt //将每行中的第二个2017替换为空,即删除
[root@svr5 ~]# sed -n 's/2017/xxxx/p test.txt // 将每行中的第一个2017替换为xxxx并打印
[root@svr5 ~]# sed '3s/2017/xxx/4' /test3.txt //将第3行中的第4个2017替换为xxx
[root@svr5 ~]# sed -n '3s/2017/xxx/4p' /test3.txt //将第三行的第4个2017替换为xxx,屏蔽默认输出。
4 sed工具的多行文本处理操作:
i: 在指定的行之前插入文本
a:在指定的行之后追加文本
c:替换指定的行
[root@svr5 ~]# sed '2a XX' a.txt //在第二行后面,追加XX
[root@svr5 ~]# sed '2i XX' a.txt //在第二行前面,插入XX
[root@svr5 ~]# sed '2c XX' a.txt //将第二行替换为XX
5 sed综合练习
[root@svr5 ~]# cat /nssw.txt
Hello the world
ni hao ma beijing
[root@svr5 ~]# sed 's/.//2;s/.$//' /nssw.txt //删除文件中每行的第二个、最后一个字符
Hllo the worl
n hao ma beijin
[root@svr5 ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/' /nssw.txt //将文件中每行的第一个、倒数1个字符互换
dello the worlH
gi hao ma beijinn
[root@svr5 ~]# sed -r 's/[0-9]//g;s/^( )+//' nssw2.txt //删除所有数字、行首空格
[root@svr5 ~]# sed -r 's/([A-Z])/[\1]/g' nssw.txt //为文件中每个大写字母添加[]括号,使用“()”可实现保留功能
[root@svr5 ~]# cat /nssw1.txt
tom 155465
[root@svr5 ~]# sed -r 's/([0-9]+)/\0\0\0/' /nssw1.txt //复制粘贴3次 这里0与1的使用效果一样。
Tom 155465155465155465
6.利用sed编写脚本:找到使用bash作登录Shell的本地用户,列出这些用户的shadow密码记录,按每行“用户名 --> 密码记录” 输出。
[root@svr5 ~]# vim /userpass.sh
w=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $w
do
pass1=$(grep $i /etc/shadow)
pass2=${pass1#*:}
pass3=${pass2%%:*}
echo "$i------>$pass3"
done