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不错。大家可以学习一下。
本文转自aaa超超aaa 51CTO博客,原文链接:http://blog.51cto.com/10983441/1763356