shell编程--正则表达式2(sed 工具使用方法,命令的实际操作)

一、 文本处理器

在Linux/UNIX 系统中包含很多种类的文本处理器或文本编辑器,grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客。

1.1 sed工具概述

sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。

sed 的工作流程:

  • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
  • 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出

1.2 sed命令常见用法

通常情况下调用 sed 命令有两种格式。

sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数

sed 命令选项主要包含以下几种:

  • -e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件。
  • -f 或–file=:表示用指定的脚本文件来处理输入的文本文件。
  • -h 或–help:显示帮助。
  • -n、–quiet 或 silent:表示仅显示处理后的结果。
  • -i:直接编辑文本文件。

sed命令常见的操作包括以下几种:

  • a:增加,在当前行下面增加一行指定内容。
  • c:替换,将选定行替换为指定内容。
  • d:删除,删除选定的行。
  • i:插入,在选定行上面插入一行指定内容。
  • p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
  • s:替换,替换指定字符。
  • y:字符转换。

1.2.1 输出符合条件的文本(p 表示正常输出)

输出所有内容,等同于"cat httpd.conf"
在这里插入图片描述
在这里插入图片描述
这里的n表示读入下一行;默认从第一行读入,p直接打印第一行,n跳过第二行,p打印第三行,所以是显示奇数行。
在这里插入图片描述
同理,显示偶数行,跳过第一行,打印第二行。
在这里插入图片描述
这种显示会有一个BUG,这个BUG我创建一个文件来演示,文件名为shiyan.txt
在这里插入图片描述
偶数行还是可以正常筛选
在这里插入图片描述
这里的筛选条件是2到10行中的奇数行,但是第十一行的内容被匹配。

原因是在第十行的时候正好执行了操作’n‘,操作‘n’执行完了会自动执行完操作‘p’才会结束,所以就出现了第十一行的内容。
在这里插入图片描述
筛选出带‘the’的内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.2 删除符合条件的文本(d)

nl 命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
.是特殊字符,用反斜杠转义
在这里插入图片描述

在这里插入图片描述

1.2.3 替换符合条件的文本

在使用 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
在这里插入图片描述

1.2.4 迁移符合条件的文本

在使用 sed 命令迁移符合条件的文本时,常用到以下参数.

  • H:复制到剪贴板;
  • g、G:将剪贴板中的数据覆盖/追加至指定行;
  • w:保存为文件;
  • r:读取指定文件;
  • a:追加指定内容。

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
在这里插入图片描述

1.2.5 使用脚本编辑文件

使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。例如执行以下命令即可将第 1~5 行内容转移至第 17 行后。

sed '1,5{H;d};17G' test.txt   ##将第 1~5 行内容转移至第 17 行后
[root@localhost ~]# vim list.txt
1,5H   ##15行复制到粘贴板
1,5d   ##15行删除
10G    ##追加到第10行后面

在这里插入图片描述

二、 sed 直接操作文件示例

用来调整 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

猜你喜欢

转载自blog.csdn.net/kimowinter/article/details/107608971