sed工具可以将进行数据的替换,删除,选取特定行等功能。
语法:
sed [-nref] ‘[n1[,n2]]function’
参数:
-n:在一般的sed的用法中,所有来自标准输入的数据行一般后会被列出到屏幕上,但是如果加上-n参数,就只会显示经过sed特殊处理的那部分数据。
-e:直接在命令行模式上进行sed的动作。
-f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
-r:sed的动作支持的是扩展型正则表达式的语法(默认是基础的正则表达式)。
-i:直接修改读取的文件内容,而不是由屏幕输出。
n1,n2:可以不存在这两个数字,代表选择进行sed动作的行数。2,5表示将在2-5行数据上进行sed动作。
function参数:
a 新增,a后面可以接字符串,这些字符串会在新的一行出现(当前行的下一行)
c 替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行。
d 删除 d后面一般不接任何参数
i 插入 i后面可以是字符串,这些字符串会在新的一行出现(当前行的上一行)
p 打印 也就是将某个选择的数据打印出来,通常p会与参数sed -n 一起运行
s 替换,可以直接进行替换的工作,通过这个s的动作可以搭配正则表达式。
删除3-5行:
1
2
3
4
5
6
7
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'3,5d'
1 root:x:0:0:root:
/root
:
/bin/bash
2 bin:x:1:1:bin:
/bin
:
/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字符串的行:
1
2
3
4
5
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'/root/d'
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
…
|
删除root到ftp之间的行(包含root,ftp所在的行):
1
2
3
4
5
6
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'/root/,/ftp/d'
15 nobody:x:99:99:Nobody:/:
/sbin/nologin
16 dbus:x:81:81:System messagebus:/:
/sbin/nologin
17 usbmuxd:x:113:113:usbmuxduser:/:
/sbin/nologin
18 rtkit:x:499:499:RealtimeKit:
/proc
:
/sbin/nologin
…
|
在第2行之后添加just like it:
1
2
3
4
5
6
7
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'2ajust like it'
1 root:x:0:0:root:
/root
:
/bin/bash
2 bin:x:1:1:bin:
/bin
:
/sbin/nologin
just like it
3 daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
4 adm:x:3:4:adm:
/var/adm
:
/sbin/nologin
…
|
在第2行之后添加多行数据时需要\符号来分隔需要添加的各行:
1
2
3
4
5
6
7
8
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'2ajust like it \
> you are not alone'
1 root:x:0:0:root:
/root
:
/bin/bash
2 bin:x:1:1:bin:
/bin
:
/sbin/nologin
just like it
you are not alone
3 daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
…
|
在第2行之前添加多行数据:
1
2
3
4
5
6
7
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'2ijust like it \
you are not alone'
1 root:x:0:0:root:
/root
:
/bin/bash
just like it
you are not alone
2 bin:x:1:1:bin:
/bin
:
/sbin/nologin
…
|
将2-6行替换为data line 2-6:
1
2
3
4
5
6
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'2,6c data line 2-6'
1 root:x:0:0:root:
/root
:
/bin/bash
data line 2-6
7
shutdown
:x:6:0:
shutdown
:
/sbin
:
/sbin/shutdown
8 halt:x:7:0:halt:
/sbin
:
/sbin/halt
…
|
单独打印3-6行:
1
2
3
4
5
6
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
-n
'3,6p'
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
…
|
如果不添加-n参数,则会全部打印并且3,6行会重复打印:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[whx@localhost ~]$
nl
/etc/passwd
|
sed
'3,6p'
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
3 daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
4 adm:x:3:4:adm:
/var/adm
:
/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
8 halt:x:7:0:halt:
/sbin
:
/sbin/halt
9 mail:x:8:12:mail:
/var/spool/mail
:
/sbin/nologin
…
|
替换字符
sed ‘/s/被替换的字符串/新的字符串/g’ ,使用sed替换字符通常可以与正则表达式一起使用。
查看/sbin/ifconfig中存在inet addr字符串的行:
1
2
|
[whx@localhost ~]$
/sbin/ifconfig
eth0 |
grep
'inet addr'
inet addr:192.168.21.130 Bcast:192.168.21.255 Mask:255.255.255.0
|
将上面的数据行中从开头位置到add:的内容删除:
1
2
|
[whx@localhost ~]$
/sbin/ifconfig
eth0 |
grep
'inet addr'
|
sed
's/^.*addr://g'
192.168.21.130 Bcast:192.168.21.255 Mask:255.255.255.0
|
将之前查询出来的数据从开头到add:之间的内容和Bcast到结尾之间的内容删除:
1
2
|
[whx@localhost ~]$
/sbin/ifconfig
eth0 |
grep
'inet addr'
|
sed
's/^.*addr://g'
|
sed
's/Bcast.*$//g'
192.168.21.130
|
将文件中存在MAN的数据行中#符号及其之后的内容删除(删除后发现文件中存在大量空白行):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[whx@localhost ~]$
cat
.
/man
.config.b |
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
/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
|
将文件中存在MAN的数据行中#符号及其之后的内容删除并且删除空白行(^$为正则表达式表示空白行):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[whx@localhost ~]$
cat
.
/man
.config.b |
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
/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
|
直接修改文件:
添加-i参数可以利用sed直接对文件进行操作,这对于大文件很有用,这可以很方便替换,删除,添加大量数据。
将man.config.b中以每行末尾的.符号替换为!:
1
2
3
4
5
6
7
8
9
10
11
|
[whx@localhost ~]$
sed
-i
's/\.$/\!/g'
man
.config.b
[whx@localhost ~]$
cat
man
.config.b
#
# Generated automatically from man.conf.inby the
# configure script!
#
# man.conf from man-1.6f
#
# For more information about this file, seethe man pages man(1)
# and man.conf(5)!
…
|
在man.config.b的末尾添加#justadd a line to test:
1
2
3
4
5
6
7
|
[whx@localhost ~]$
sed
-i
'$a #just add aline to test'
man
.config.b
[whx@localhost ~]$
cat
man
.config.b |
tail
-n 5
# Otherwise the database will be updated!
#
# Set up PATH to MANPATH mapping
#MAKEWHATISDBUPDATES n
#just add a line to test
|