在Linux/UNIX 系统中包含很多种类的文本处理器或文本编辑器,grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客。
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
sed 的工作流程:
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出
通常情况下调用 sed 命令有两种格式。
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
sed 命令选项主要包含以下几种:
sed命令常见的操作包括以下几种:
输出所有内容,等同于"cat httpd.conf"
这里的n表示读入下一行;默认从第一行读入,p直接打印第一行,n跳过第二行,p打印第三行,所以是显示奇数行。
同理,显示偶数行,跳过第一行,打印第二行。
这种显示会有一个BUG,这个BUG我创建一个文件来演示,文件名为shiyan.txt
偶数行还是可以正常筛选
这里的筛选条件是2到10行中的奇数行,但是第十一行的内容被匹配。
原因是在第十行的时候正好执行了操作’n‘,操作‘n’执行完了会自动执行完操作‘p’才会结束,所以就出现了第十一行的内容。
筛选出带‘the’的内容
nl 命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
.是特殊字符,用反斜杠转义
在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y(字符转换)命令选项,常见的用法如下所示
sed ‘s/the/THE/’ shiyan.txt
sed ‘s/the/THE/g’ shiyan.txt
sed ‘s/a/P/2’ shiyan.txt
sed ‘s/o//g’ shiyan.txt
sed ‘s/^/#/’ shiyan.txt
sed ‘/the/s/^/#/’ shiyan.txt
sed ‘s/$/EOF/’ shiyan.txt
sed ‘6,8s/the/THE/g’ shiyan.txt
sed ‘/the/s/o/777/g’ shiyan.txt
在上一条命令的基础上我再加一个操作p
通常p与-n一起使用,表示只打印输出结果
sed ‘/ccc/athis is wy world’ shiyan.txt
在使用 sed 命令迁移符合条件的文本时,常用到以下参数.
sed
sed ‘1,5{H;d};10G’ shiyan.txt
sed ‘/the/w test01.txt’ shiyan.txt
sed ‘/the/r /root/test.txt’ shiyan.txt
sed ‘3anew\nnew’ shiyan.txt
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。例如执行以下命令即可将第 1~5 行内容转移至第 17 行后。
sed '1,5{H;d};17G' test.txt ##将第 1~5 行内容转移至第 17 行后
[root@localhost ~]# vim list.txt
1,5H ##1到5行复制到粘贴板
1,5d ##1到5行删除
10G ##追加到第10行后面
用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在, 若不存在则使用 cp 命令进行文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd systemctl enable vsftpd