sed工具

[root@localhost ~]#sed   [-nefr]  [动作]

参数:

-n  : 使用安静模式。在一般sed用法中,所有来自STDIN的数据一般都会列出到屏幕上。但是如果加上-n参数后,则只有经过sed特殊处理的那一行(操作)才会被列出来。

-e  :直接在命令行模式上进行sed的动作编辑。

-f  :直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的动作。

-r  :  sed的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)。

-i  :  直接修改读取的文件内容,而不是由屏幕输出。

动作说明: [n1 [,n2]]  function 

n1 , n2 : 不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则“10,20 [动作行为]”


function有下面这些参数:

a   :新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)

c   :替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行!

d   :删除,因为是删除,所以d后面通常不接任何参数。

i    :插入,i后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)。

p    :打印,也就是将某个选择的数据打印出来。通常p会与参数sed –n 一起运行。

s    :替换,可以直接进行替换工作。通常这个s的动作可以搭配正则表达式!



以行为单位的新增/删除功能

范例一:将passwd的内容列出并且打印行号,同时将2~5行删除。

[root@localhost opt]# nl passwd

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

[root@localhost opt]# nl passwd | sed '2,5d'

     1 root:x:0:0:root:/root:/bin/bash

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

     9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

[root@localhost opt]# nl passwd | sed '4,$d'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

sed后面接的动作,请务必以’’两个单引号括住。

如果题型变化,举例来说,如果只要删除第2行,可以使用nl passwd | sed ‘2d’来完成,至于若要删除第3行到最后一行,则是nl passwd | sed ‘3,$d’,那个¥代表最后一行。

范例二:在第二行(即加在第三行)加上“drink tea?”字样!

[root@localhost opt]# nl passwd|sed '2a drink tea?'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

drink tea?

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

在a后面加上的字符串已经出现在第2行后面。如果要加在第2行前面呢,nl passwd| sed ‘2i drink tea?’

[root@localhost opt]# nl passwd | sed '2i drink tea?'

     1 root:x:0:0:root:/root:/bin/bash

drink tea?

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

增加一行很简单,那如果是要增加两行以上呢。

范例三:在第二行后面加入两行字,例如“drink tea or …….”与”drink beer?”

[root@localhost opt]# nl passwd | sed '2a drink tea ......\

> drink beer'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

drink tea ......

drink beer

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

这个范例的重点是我们可以新增不只一行,可以新增加好几行,但是每一行之间都必须以反斜杠“\”来进行新行的增加。所以,我们发现在第一行的后面就有\存在,那是一定要的。

以行为单位的替换与显示功能

范例四:将2-5行的内容替换为“no 2-5 number”

[root@localhost opt]# nl passwd | sed '2,5c no number'

     1 root:x:0:0:root:/root:/bin/bash

no number

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

通过这个方法我们就能够将数据整行替换了。我们以前想要列出第11-20行,要通过head –n 20 |tail –n 10 之类的方法来处理,很麻烦。sed则可以简单直接取出想要的几行看看下面的例子。

范例五:仅列出passwd文件内的第5-7行

[root@localhost opt]# nl passwd | sed -n '5,7p'

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

上述命令中有个重要的参数-n,按照说明文件,这个-n代表的是“安静模式”!那么为什么要使用安静模式呢?你可以自行执行sed ‘5,7p’就知道了(5-7行会重复输出)。与没有加上-n的参数时,输出的数据可是差很多呢。你可以通过这个sed的以行为单位的显示功能,就能将某个文件内的某些行号查出来。

[root@localhost opt]# nl passwd | sed  '5,7p'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

     9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

部分数据的查找并替换功能

   除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换功能。基本上sed的查找与替换和vi非常类似,他有点像这样:

sed ‘s/要被替换的字符串/新的字符串/g’

下面举例子:

步骤一:查看原信息,查询IP

[root@localhost opt]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:82:6E:49  

          inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe82:6e49/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8217 errors:0 dropped:0 overruns:0 frame:0

          TX packets:5502 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:810496 (791.5 KiB)  TX bytes:863585 (843.3 KiB)

步骤二:利用关键字配合grep选取出关键的一行数据。

[root@localhost opt]# ifconfig eth0|grep 'inet addr'

          inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

步骤三:将IP前面的部分予以删除

[root@localhost opt]# ifconfig eth0|grep 'inet addr'|sed 's/^.*addr://g'

192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

步骤四:将IP后面的部分予以删除

[root@localhost opt]# ifconfig eth0| grep 'inet addr'| sed 's/^.*addr://g'|sed 's/Bcast.*$//g'

192.168.211.128

再举一个例子

步骤一:先使用grep将关键字MAN所在行取出来


[root@localhost opt]# cat /etc/man.config | grep 'MAN'

# when MANPATH contains an empty substring), to find out where the cat

# MANBIN pathname

# MANPATH manpath_element [corresponding_catdir]

# MANPATH_MAP path_element manpath_element

# MANBIN /usr/local/bin/man

# Every automatically generated MANPATH includes these fields

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

# MANPATH /opt/*/man

# MANPATH /usr/lib/*/man

# MANPATH /usr/share/*/man

# MANPATH /usr/kerberos/man

# Set up PATH to MANPATH mapping

MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man

# and the MANSECT environment variable is not set (1x-8x sections are used by

MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

#MANDEFOPTIONS -a

步骤二:删除掉批注之后的数据!

[root@localhost opt]# cat /etc/man.config | grep 'MAN'|sed 's/#.*//g'







MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man






MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man


MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

步骤三:将空白行删除掉

[root@localhost opt]# cat /etc/man.config | grep 'MAN'|sed 's/#.*//g'|sed '/^$/d'

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man

MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

直接修改文件内容

sed也可以直接修改文件内容。

[root@localhost opt]# sed -i '$a #This is a test' passwd

[root@localhost opt]# nl passwd | sed -n '$p'

    37 #This is a test

这个sed不错。大家可以学习一下。