Shell
1.Sed流式编辑器
可以非交互式的增删改查,逐行处理
解释:如果指定行操作,就只操作一行,如果没有指定,那么就操作所有行
1.前置命令 | sed 选项 (定址符)指令
-
sed 选项 (定址符)指令 被处理的文档
选项: -n 屏蔽默认输出 -r支持扩展正则 -i写入文件
指令:p输出 d删除 s替换
[root@tedu ~]# sed 'p' test #输出test里面的内容
[root@tedu ~]# sed -n 'p' test #屏蔽默认输出
[root@tedu ~]# sed -n '2p' test #查看第一行
[root@tedu ~]# sed -n '1,3p' test #查看1到3行
[root@tedu ~]# sed -n '1p;3p' test #查看第1行和第3行
[root@tedu ~]# sed -n '2,+1p' test #从第二行看,往后面看1行
[root@tedu ~]# sed -n '1~2p' test #查看奇数行
[root@tedu ~]# sed -n '2~2p' test #查看偶数行
结合使用正则
[root@tedu ~]# sed -n '/root/p' test #查找root的行
root:x:0:0:root:/root:/bin/bash
[root@tedu ~]# grep "root" test #查找root的行
root:x:0:0:root:/root:/bin/bash
[root@tedu ~]# sed -n '/^root/p' test #查找root开头的行
[root@tedu ~]# grep "^root" test #查找root开头的行
[root@tedu ~]# sed -n '/bash$/p' test #查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
[root@tedu ~]# grep -n "bash$" test #查找bash结尾的行
1:root:x:0:0:root:/root:/bin/bash
oot@tedu ~]# sed -n '=' test #显示所有行号
[root@tedu ~]# sed -n '$=' test #查看最后一行
删除
[root@tedu ~]# sed 'd' test #删除所有的行
[root@tedu ~]# sed '1d' test #删除第1行
[root@tedu ~]# sed '2,4d' test #删除2到4行
[root@tedu ~]# sed '3,+2d' test #从第3行往后删,删除2行
[root@tedu ~]# sed '1~2d' test #删除偶数行
[root@tedu ~]# sed '2d;4d' test #删除第2行和第四行
[root@tedu ~]# sed '/root/d' test #删除带root的行
[root@tedu ~]# sed '/root/!d' test #删除不包含root的行
[root@tedu ~]# sed '/^root/d' test #删除以root开头的行
[root@tedu ~]# sed '$d' test #删除文件的最后一行
[root@tedu ~]# sed '/^$/d' test #删除所有的空行
执行删除操作
[root@tedu ~]# sed -i '$d' test #删除最后一行
替换字符串
sed命令的s替换基本功能(s/旧内容/新内容/选项)
[root@tedu ~]# vim test.txt //新建素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@tedu ~]# sed 's/2017/xxxx/' a.txt #替换2017位xxxx默认替换第一个
[root@tedu ~]# sed 's/2017/xxxx/2' a.txt #同上替换第二个
[root@tedu ~]# sed '2s/2017/xxxx/2' a.txt #替换第二行的第二个
[root@tedu ~]# sed '2s/2017/xxxx/g' a.txt #替换所有行的所有个
[root@tedu ~]# sed '/2018/s/2017/xxxx/' a.txt #查找有2018的行,修改2017为xxxx
#查找有2017的行,修改2017为xxxx
[root@tedu ~]# sed '/2017/s/2017/xxxx/' a.txt
#查找以2017结尾的行,修改2017为xxxx
[root@tedu ~]# sed '/2017$/s/2017/xxxx/' a.txt
#替换为空
[root@tedu ~]# sed '/2017$/s/2017//' a.txt
[root@tedu ~]# sed 's/2017//' a.txt #替换全部的2017为空
[root@tedu ~]# sed '3s/2017//' a.txt #替换第三行的2017为空
[root@tedu ~]# sed -n '3s/2017//p' a.txt #显示你修改的行
#应用
2、sed高级用法
()属于扩展正则
()保留(复制的意思) \1\2\3
[root@tedu ~]# echo abc > j.txt
[root@tedu ~]# sed -r 's/(a)(b)(c)/123/' j.txt #安顺序显示abc
[root@tedu ~]# sed -r 's/(a)(b)(c)/321/' j.txt #显示cba
[root@tedu ~]# sed -r 's/(a)(b)(c)/\1\1\1/' j.txt #全部复制为a
[root@tedu ~]# sed -r 's/(.)(.)(.)/\2\3\1/' j.txt #使用匹配
[root@tedu ~]# vim n.txt
Hello the world
ni hao jiangxi
jin tian zhen shi 666
#将文本中的第一个字符和最后一个字符对调
[root@tedu ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/' n.txt
#为文件中的每个大写字母添加括号
[root@tedu ~]# grep "[A-Z]" test
[root@tedu ~]# sed -r 's/([A-Z])/[\1]/' n.txt
案例
编写脚本,实现vsftpd服务部署,可以实现匿名上传文件
进入vim文本编辑器中 :set nu 显示行号
#第12行
anonymous_enable=YES #允许匿名用户使用,但只是可以读,不能写入,默认开启
第二十九行
#anon_upload_enable=YES #允许用户实现上传,默认关闭
[root@tedu ~]# systemctl status firewalld #查看防火墙
[root@tedu ~]# getenforce #查看SELinux
[root@tedu ~]# systemctl stop firewalld #暂时关闭防火墙
扩展
sed
指令:a:在指定的行之前插入文本 i:在指定的行之后追加文本 c:替换指定的行
[root@tedu ~]# cat test
abcd
abcd
abcd
abcd
[root@tedu ~]# sed '1i 666' test #在第一行之后插入文本
[root@tedu ~]# sed '1a 666' test #在第一行之前插入文本
[root@tedu ~]# sed 'i 666' test #给所得行之后插入文本
[root@tedu ~]# sed '1,3i 666' test #给第1行和第3行插入文本