sed 英文的全称是stream editor翻译成中文流式编辑器,所有的处理动作都在模式空间处理,而保留空间默认是空的。支持正则表达式的元字符,默认支持基本正则表达,如果要使用扩展正则表达则需要加上-r选项。

sed用法_sed

1,语法有五种

(1)sed [ options ] 'scripts'(sed的子命令,sed的脚本) input_file...(如果有变量就要用双引号)

(2)sed [ options ] -f script_file  input_file...(script_file可以 是事先写好的命令,sed的子命令放在一个文件里)

(3)sed 'addr1,addr2command' input_file... 

(4)sed  'addr1,+ncommand' input_file ...(+n相对addr1)

(5)sed '/pattern/command' input_file...(表示只有能匹配到这个模式的行才会应用这个命令command)

 2,常用选项:

-r:使用扩展正则表达式

-e:可以使用多个脚本

-i:直接操作原文件,在屏幕上不会再显示

-n:静默模式,只显示被匹配的行。一般与p命令一起用

 3,sed 的子命令

 (1)p:被匹配到的行被显示

   显示3到5行

   sed -n '3,5p' /etc/passwd 

   sed -n '3,+2p' /etc/passwdsed用法_sed_02

如果不-n,则会是另外一种效果

sed用法_sed_03

(2)d:删除指定行

    删除3到10行

    sed '3,10d' /etc/passwd

(3)s:查找替换 s/pattern/string/(跟vim里的用法一样)

    查找以数字开头的行,替换成hollo

    sed 's/^[0-9].*/hello/g' /etc/inittab

sed用法_sed_04

(4)a \:在模式匹配到行的后面添加新内容,\要添加的内容 

    在/etc/inittab最后一行,添加hello,how are you?

    sed '$a \hello,how are you' /etc/inittab($表示最后一行的意思)

sed用法_sed用法_05

  如果要添加两行以上,就需要用到换行符\n

  sed '$a \hello,how are you \n   very good.' /etc/inittab

sed用法_sed用法_06

(5)i \:在模式匹配到的行前面添加新内容

    在/etc/inittab第一行,添加hello,how are you?

    sed '1i \hello,how are you?' /etc/inittab

(6)r file:读取file里的内容到某行下面

    将/etc/hosts添加到/etc/inittab的第二行后面

    sed '2r /etc/hosts' /etc/inittab

(7)w file:将模式匹配到的行保存到另外一个文件

    将#开头的行保存到另外一个文件

    sed '/^#/w  /tmp/tmp.txt' /etc/inittab

(8)=:打印行号

    为/etc/inittab每一行添加行号

    sed '=' /etc/inittab

(9)x:保留空间和模式空间内容对调

  sed 'x' /etc/passwd(结果第一行前面增加了一行空白)

(10)n:覆盖式把下一行读入模式空间

     把偶数行删除    

   sed 'n;d' /etc/passwd (sed 默认读取一行到模式空间,执行n命令之前将模式空间的内容先处理,处理完之后开始执行n命令,n读取下一行,执行d命令)

(11)N:把下一行以追加的方式读入模式空间

       把两行合并成一行,并用空格空开

     sed 'N;s/\n/ /' /etc/passwd(由于每行都会有一个断行符,将\n替换成空格

(12) h(hold):将模式空间中的内容复制到保留空间,覆盖的方式

     把文件里的内容颠倒下

    sed  '1!G;h;$!d' /etc/passwd(叹号表示对命令取反,第一行不执行G命令)

(13)H:将模式空间中的内容复制到保留空间,追加的方式

    将第一行,第二行追加到最后一行

   sed  '1{h;d};2{D;d};$G' /etc/passwd

(14)g:将保留空间的内容复制到模式空间,覆盖的方式

  将全部内容变量空白 

   sed 'g' /etc/passwd (如果加-i,则/etc/passwd里的内容全部变成空白,操作原文件慎重)

(15)G:将保留空间的内容复制到模式空间,追加的方式

     给每一行添加空白

     sed 'G' /etc/passwd

(16)b:跳转,略过符合的行 ,b label 表示先做标记,(label的长度不能超过7个)而: label 跳转到之前做label的位置 

    带有#号的行不显示 

    sed -n '/#;p' /etc/inittab

    有数字的行添加#号,没有数字的行添加%

    sed '.*[0-9].*/b para;s/.*/%&/;:para;s/.*[0-9].*/#&/g' /etc/inittab(先查找有数字的行,并做一个para的标记,没有数字的行就执行s/.*/%&/这条命令:para跳到s/.*[0-9].*/#&/g执行这个命令

(17)t labe:测试:前面的s命令执行成功就跳转到标记位置

(18)y/字符集1/字符集2/ (将字符集1的内容换成字符集2)

   将b换成B,r换成R

  sed 'y/br/BR/' /etc/passwd

 (19)m~n:表示步近用法(m表示启始位,执行完后在m的基础上加n)

    将1,6,11....显示出来 

  cat -n /etc/passwd | sed -n '1~5p' (每次在前一次基础上加5)

sed用法_sed用法_07

20,查找时间段的日志:

sed -n '/2016-02-23 13:47:41/,/2016-02-23 15:26:44/p' appbe.log2016-02-23