Shell编程四剑客之SED
SED是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与VIM编辑器类似,它一次处理一行内容,Sed可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),紧接着用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。
逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。其语法参数格式为:
命令格式 sed [选项] ‘命令’ 文件名 命令 | sed [选项] ‘命令’ 选项 -n 屏蔽sed的默认输出 -i 直接对源文件进行操作 -f 后接sed脚本文件名 -r 写正则表达式时不用写转义符,和其他选项一起使用的时候,要放在选项列表的首位。 -e 执行多条sed命令 sed替换标记g 表示行内全面替换。 p 表示打印行。 w 表示把行写入一个文件。 x 表示互换模板块中的文本和缓冲区中的文本。 y 表示把一个字符翻译为另外的字符(但是不用于正则表达式) \1 子串匹配标记 & 已匹配字符串标记 sed命令x #x为指定行号; x,y #指定从x到y的行号范围; /pattern/ #查询包含模式的行; /pattern/pattern/ #查询包含两个模式的行; /pattern/,x #从与pattern的匹配行到x号行之间的行; x,/pattern/ #从x号行到与pattern的匹配行之间的行; x,y! #查询不包括x和y行号的行; r #从另一个文件中读文件; w #将文本写入到一个文件; y #变换字符; q #第一个模式匹配完成后退出; l #显示与八进制ASCII码等价的控制字符; {} #在定位行执行的命令组; p #打印匹配行; = #打印文件行号; a\ #在定位行号之后追加文本信息; i\ #在定位行号之前插入文本信息; d #删除定位行; c\ #用新文本替换定位文本; s #使用替换模式替换相应模式; n #读取下一个输入行,用下一个命令处理新的行; N #将当前读入行的下一行读取到当前的模式空间。 h #将模式缓冲区的文本复制到保持缓冲区; H #将模式缓冲区的文本追加到保持缓冲区; x #互换模式缓冲区和保持缓冲区的内容; g #将保持缓冲区的内容复制到模式缓冲区; G #将保持缓冲区的内容追加到模式缓冲区。 sed元字符集^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
|
常用SED工具企业演练案列:
实验用文件: cat /etc/passwd >file.txt
(1) 替换file.txt文本中old为new:
sed 's/root/tom/g' file.txt |
(2) 打印file.txt文本第一行至第三行:
sed -n '1,3p' file.txt |
(3) 打印file.txt文本中第一行与最后一行:
sed -n '1p;$p' file.txt |
(4) 删除file.txt第一行至第三行、删除匹配行至最后一行:
sed '1,3d' file.txt sed '/rpc/,$d' file.txt |
(5) 删除file.txt最后6行:
for i in `seq 1 6`;do sed -i '$d' file.txt ;done |
(6) 删除file.txt最后1行:
sed -i '$d' file.txt |
(7) 在file.txt查找file所在行,并在其下一行添加word字符,a表示在其下一行添加字符串:
sed '/adm/aword' file.txt |
(8) 在file.txt查找file所在行,并在其上一行添加word字符,i表示在其上一行添加字符串:
sed '/adm/iword' file.txt |
(9) 在file.txt查找以test结尾的行尾添加字符串word,$表示结尾标识,&在Sed中表示添加:
sed 's/test$/&word/g' file.txt |
(10) 在file.txt查找mail的行,在其行首添加字符串word,^表示起始标识,&在Sed中表示添加:
sed '/mail/s/^/&word/' file.txt |
(11) 多个sed命令组合,使用-e参数:
sed -e '/systemd-network/s/^/&1./' -e 's/sync$/&./g' file.txt |
(12) 多个sed命令组合,使用分号“;”分割:
sed -e '/systemd-network/s/^/&1./;s/sync$/&./g' file.txt |
(13) Sed读取系统变量,变量替换:
WEBSITE=WWW.file.NET sed “s/nobody/$WEBSITE/g” file.txt |
(14) 修改Selinux策略enforcing为disabled,查找/SELINUX/行,然后将其行enforcing值改成disabled、!s表示不包括SELINUX行:
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config |
通常而言,SED将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这时可以使用SED高级语法来满足用户需求。总的来说,SED高级命令可以分为三种功能:
q N、D、P:处理多行模式空间的问题;
q H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑;
q :、b、t:在脚本中实现分支与条件结构。
(1) 在file.txt每行后加入空行,也即每行占永两行空间,每一行后边插入一行空行、两行空行及前三行每行后插入空行:
sed '/^$/d;G' file.txt sed '/^$/d;G;G' file.txt sed '/^$/d;1,3G;' file.txt |
(2) 将file.txt偶数行删除及隔两行删除一行:
sed 'n;d' file.txt sed 'n;n;d' file.txt |
(3) 在file.txt匹配行前一行、后一行插入空行以及同时在匹配前后插入空行:
sed '/file/{x;p;x;}' file.txt sed '/file/G' file.txt sed '/file/{x;p;x;G;}' file.txt |
(4) 在file.txt每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
sed '/^$/d;G' file.txt |
(5) 在file.txt每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
sed '/^$/d;G' file.txt |
(6) 在file.txt每行前加入顺序数字序号、加上制表符\t及.符号:
sed = file.txt| sed 'N;s/\n/ /' sed = file.txt| sed 'N;s/\n/\t/' sed = file.txt| sed 'N;s/\n/\./' |
(7) 删除file.txt行前和行尾的任意空格:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt |
(8) 打印file.txt关键词old与new之间的内容:
sed -n '/old/,/new/'p file.txt |
(9) 打印及删除file.txt最后两行:
sed '$!N;$!D' file.txt sed 'N;$!P;$!D;$d' file.txt |
(10) 合并上下两行,也即两行合并:
sed '$!N;s/\n/ /' file.txt sed 'N;s/\n/ /' file.txt |
(11) 删除文件中所有行
sed -i 'd' file.txt |
(12) 删除带有adm的行
sed -i '/adm/d' file.txt |
(13) 删除文件中所有的空行
sed -i '/^$/d' file.txt |
(14) 将文件中1到3行的行首加“#”
sed -i '1,3s/^/#/' a.txt |
(15) 删除每行中的空格
sed -ri 's/ +//g' file.txt |
(16)、企业案例:优化ssh的配置
sed -ri '13i Port 52113\nPermintRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config |
(17)、企业案例:系统开机启动项优化
chkconfig --list | grep 3:on|grep -vE "sshd|crond|network|rsyslog|sysstat" |awk '{print $1}'|sed -r 's/(.*)/chkconfig \1 off/g' |bash |