Shell 文本三剑客之sed
引言:在Linux/UNIX系统中包含很多种类的文本处理器或文本编辑器,其中包括VIM编辑器与grep等,而grep、sed、awk更是Shell编程中经常用到的文本处理工具,被称为Shell编程三剑客,本篇介绍的就是其中之一的sed。
一、sed工具
1.sed概述
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行,sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
2.sed工作流程
sed的工作流程主要包括读取、执行和显示三个过程
- 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称为模式空间,pattern sapce)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上一次执行
- 显示:发送修改后的内容到输出流,在发送数据后,模式空间将会被清空,在所有的文件内容都被处理完成之气那,上述过程将重复执行,直至所有内容被处理完成
**注意:**默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出
3.sed的命令
sed命令常见用法:
通常情况下调用sed命令有两种格式,其中’参数’是指操作的目标文件
当存在多个操作对象时用,文件之间用逗号",“分隔,而scroptfile表示脚本文件,需要用”-f"选项指定,
当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件
sed [选项] '操作' 参数
sed [选项] -f scroptfile
sed -e '编辑指令' 文件1 文件2 ……
sed -n -e '编辑指令' 文件1 文件2……
sed -i -e '编辑指定' 文件1 文件2……
常见的命令选项:
-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件
-h 或--help=:显示帮助
-n、--quiet 或 silent:表示仅显示处理后的结果
-i.bak:直接编辑文本文件
-r,-E:使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流
操作用于指定对文件操作的动作行为,也就是sed的命令,通常情况下是采用"[n1,[n2]]"操作参数的格式,n1,n2是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为"5,20 动作行为",
常见的操作:
a:增加,在当前行下面增加一行指定内容
c:替换,将选定行替换为指定内容
d:删除,删除选定的行
i:插入,在选定行上面插入一行指定内容
p:打印,如果同时指定行,表示打印指定行,如果不指定行,将打印所有内容
如果有非打印字符,以ASCII码输出,一般与'-n'选项配合使用
s:替换,替换指定字符
y:字符转换
编辑命令格式
[地址1] [地址2] 操作 [参数]
地址:可数字、正则表达式;$没有地址代表所有行
操作:可以是a、c、d、p、s、r、w、i、s、y等
参数:一般有g,代表只要符合条件的全部进行处理
4.案例
4.1打印同时指定某一行,如果不指定就全部打印;
sed -n 'p' test.txt 等同于cat
4.2打印第三行和第五行
sed -n '3,5p' test.txt 显示第三行到第五行的内容
4.3打印指定行;以及奇数偶数行
sed -n 'p:n' test.txt 打印奇数行
sed -n 'n:p' test.txt 打印偶数行
4.4打印12行到尾部的奇数,
sed -n '12,$(p:n)' test.txt
12行为第一行,
第2个n表示读入下一行资料
4.5打印出第二行所有内容,可结合cut、awk打印某一列
4.6打印出"the"字符串,
sed -n '/the/p' test.txt 输出包含the的行
4.7查看从第四行第一个包含the的行
4.8查看在哪几行有该字符
4.9以什么什么开头,必须+p才能打印!!
4.10 以"."作为结尾的
4.11以数字结尾的
4.12查找以’wood’字符所在
’ \ ’ 包含,边界符
二、nl删除符合条件的文本
1.1打印相应的行数,空格不算
1.2删除指定行
1.3删除3-6行
1.4删除a-z开头所有小写的行
1.5删除指定字符的行
2.sed替换
2.1替换指定字符
2.2将行中在一起的字符替换为大写字符
把在一起的o第二个o替换为大写O
2.3文件指定字符替换
所有"the" 替换为"THE"
2.4删除所有空行
"/^$"代表空行
3.sed添加
3.1在每行行首添加字符
3.2在指定字符行行首添加
3.3在每行行尾加入指定字符
3.4指定行的指定字符更换
3.5把包含the行中的h换成d
3.6set -i关闭虚拟机临时增强功能
3.7把第二个l化成L
4.sed迁移符合条件的文本
使用sed命令迁移符合条件的文本时,常用参数:
H:复制到剪贴板
g、G:将剪贴板中的数据覆盖/追加至指定行:
w:保存为文件
r:读取指定文件;
a:追加指定内容,
I,i 忽略大小写
4.1将包含the的行迁移至行尾
4.2将3~5行内容迁移至其他行行尾
4.3截取文件内容保存到其他文件
4.4读取其他文件内容,选择the的字符串复制到本文件内
4.5打印输出IP地址的第二以数字.开头的内容,并打印出第一个组
4.6在指定行插入内容
4.7在包含the行下面插入字符
4.8指定行后加入多行内容
\n换行
5.sed使用脚本编辑文件
使用sed对脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过"-f"选项来调用
5.1将1-5行剪切到16行后
5.2将1-6行内容转移到第16行后
5.3sed脚本调用
sed -f操作文件脚本和sed ‘1,5{H;d};16G’ test.txt
5.4sed直接操作脚本实例
编写一个脚本用来调整vsftpd服务配置,要求禁止匿名用户。但允许本地用户(也允许写入)
提前关闭防火墙,关闭增强功能,按照vsftpd服务
#!/bin/bash
#指定样本文件路径,配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFI="/etc/vsftpd/vsftpd.conf"
#备份原来的在,若不存在则使用cp命令进行配置文件,检测文件名为/etc/vsftpd.conf.bak
#备份文件是否存在文件备份
[ ! -e "$CONFI.bak" ] && cp $CONFI $CONFI.bak
sed -e '/^anonymoous_enable/s/YES/NO/g' $SAMPLE > $CONFI
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFI
grep "listen" $CONFI || sed -i '$alisten=YES' $CONFI
#启动vsftpd服务。并设为开机后自动运行
systemctl restart vsftpd
systemctl enable vsftpd
-e目录或文件
运行脚本
查看配置文件是否修改成功
总结
本篇内容主要讲解了网络三剑客之一的sed,sed命令常用于对一整行字符的处理,了解到sed的一些作用;利用大量的案例对sed常用选项参数的使用做了简单的讲解,通过sed命令的拆分讲解,一些新手可以作为简单的参考来进行实际操作