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

posted @ 2019-11-18 10:59  走天涯123  阅读(165)  评论(0编辑  收藏  举报