sed 命令
1.命令格式:
- sed 参数 命令 处理对象
- sed 参数 处理对象 -f 处理规则文件
-f表示:指定我们的命令规则储存文件
-n静默模式:不把模式空间里的东西显示出来
2.对字符的处理
字符 | 作用 |
---|---|
p | 显示 |
d | 删除 |
a | 添加 |
c | 替换 |
w | 写入 |
i | 插入 |
r | 整合文件 |
具体用法:
【1】 p 显示
-e表示多条策略
命令 | 作用 |
---|---|
sed -n 5p westos | 显示第五行 |
sed -n 3,5p westos | 显示3到5行 |
sed -ne "3p;5p westos | 显示3和5行 |
sed -ne 1,5p westos | 显示1-5行 |
sed -ne ‘5,$p’ westos | 显示5到最后一行 |
sed -n ‘/^#/p’ fstab | 显示以#开头的行 |
练习:
【2】d 删除
命令 | 作用 |
---|---|
sed 5d westos | 删除第五行 |
sed ‘/^#/d’ fstab | 把#开头的行删除 |
sed ‘/^UUID/!d’ fstab | 除了UUID以外的行都删除 |
sed -e ‘5,$d’ westos | 删除5到最后一行 |
练习:
- 删除第5行
- 把#开头的行删除
- 只保留UUID这行,其余的都删除掉
- 删除5到最后一行
【3】 a 添加
命令 | 作用 |
---|---|
sed -e ‘$a 开心’ fstab | 最后一行添加 |
sed -e ‘$a 开\n心’ fstab | 会换行添加 |
sed -e ‘/^#/a 开心’ fstab | 所有以#开头的行后添加 |
练习:
- sed -e ‘$a 开心’ fstab 最后一行添加
- sed -e ‘$a 开\n心’ fstab 会换行
- sed -e ‘/^#/a 开心’ fstab 所有以#开头的行
【4】 c 替换
命令 | 作用 |
---|---|
sed -e ‘/^#/c hello world’ fstab | fstab中所有以#开头的行,都被替换 |
sed ‘6chello world’ westos | 将第6行替换为 |
- sed -e ‘/^#/c hello world’ fstab fstab中所有以#开头的行,都被替换为
- sed ‘6chello world’ westos 将第6行替换为
【5】w 把符合的行写到指定文件中
命令 | 作用 |
---|---|
sed ‘/^UUID/w westofile’ fstab | 把westos中UUID开头的行写入westosfile中 |
练习:
注意:sed '/bash$/w haha' westos
将westos中的以bash为结尾的行写入到haha中,作用与grep bash westos > xixi
是相同的
【6】i插入
命令 | 作用 |
---|---|
sed ‘5ihello westos’ westos | 插入 |
【7】r 整合文件
命令 | 作用 |
---|---|
sed ‘5r haha’ westos | 将haha中的内容整合到第5行的下面 |
练习:
3.sed 字符替换用法
sed 字符替换
sed 's/:/###/g' westos 将:替换为###
sed 's/:/###/' westos 仅第一个被替换
sed '1,5s/:/###/g' westos 1-5行
sed '1s/:/###/g' westos 第1行
sed '1s/:/###/g;5s/:/###/g' westos 第1行和第5行
sed '/lp/,/shutdown/s/:/###/g' westos
sed 's/\//####/g' westos 替换westos中的/
sed 's@/@####@g' westos
sed 's@/@####@g' -i westos 把sed处理的内容保存到westos文件中
练习:
- 1-5行 + 第1行和第5行
- sed ‘/lp/,/shutdown/s/😕###/g’ westos
- sed ‘s///####/g’ westos 替换westos中的/
当需要替换 / 时,需要\转译,不能直接s///##/g
或者使用@,因为分隔符的表示方法有两种,一种是/另一种是@
- sed ‘s@/@####@g’ -i westos 把sed处理的内容保存到westos文件中
以上操作没有改变原文件内容,使用-i把处理后的诶荣可以保存到westos中
练习脚本Apache_port.sh
问题:此脚本后接入数字,http的端口就改为此数字。(假设selinux为关闭状态)
以下展示了思考过程
- 用脚本安装apache
&>/dev/null 表示不显示信息
1 #!/bin/bash
2 [-e "/etc/httpd/conf/httpd.conf" ] || {
3 yum install httpd -y &>/dev/null
4 }
- 判断数字是否为空
[ -z "$1"] && {
echo "Error:not port number.Please give port folowing script"
exit
}
- 如果不为空,则还需判断端口是否正在被使用
注意:" "之间要有``,否则就会出错
[root@xixi ~]# [ -z "`netstat -antlupe | grep 1111`" ] && echo yes || echo no
yes 正确的
[root@xixi ~]# [ -z "netstat -antlupe | grep 1111" ] && echo yes || echo no
no 错误的
[root@xixi ~]# [ -z "`netstat -antlupe | grep 21`" ] && echo yes || echo no
no
[root@xixi ~]# [ -z "`netstat -antlupe | grep 6666`" ] && echo yes || echo no
yes
[root@xixi ~]#
此时能判断出端口是否正在被使用
-
一定不要忘记-i插入,如果只使用-c替换的话,原文件不会被修改,只会把替换后文件中的内容显示出来
难点:
修改后,直接变为了 Listen $1
这是因为使用的是单引号,改为双引号就好了
-
验证
注意:
执行优先级
反向单引号表示:里面的内容优先执行
反向单引号与 $ 通用的级别不一样,$在shell里用,``在python里面也能使用