分类: LINUX
2009-11-23 20:29:37
参考资料:《鸟哥的私房菜》
sed [-nefr] [动作]
【功能】sed 可以分析处理标准输入的数据, 然后将它们输出到标准输出。可进行的处理包括取代、删除、新增、撷取特定行等等。
【举例】
例1:将 /etc/passwd 的内容列出,并且需要打印行号,同时,将第 3~28行删除:
$ nl /etc/passwd |sed '3,28d'
输入之后,产生如下输出:
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
29 polkituser:x:107:115:PolicyKit,,,:/var/run/PolicyKit:/bin/false
30 haldaemon:x:108:116:Hardware abstraction layer,,,:/var/run/hald:/bin/false
31 gdm:x:109:117:Gnome Display Manager:/var/lib/gdm:/bin/false
注意:
1)原本应该是sed -e 才对,这里没-e 也行。
2)sed 后面接的动作,必须用 '' 两个单引号括住。
例2:将 /etc/passwd 的内容列出,并且需要打印行号,同时,将第 3行删除:
$nl /etc/passwd | sed '3d'
输出将不显示第3行由于篇幅,就省略了。
例3:将 /etc/passwd 的内容列出,并且需要打印行号,同时,将第3行到最后一行删除:
$nl /etc/passwd | sed '3,$d'
输入之后,输出如下:
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
例4:在例1的基础上,在第2行后(亦即是加在第3行)加上『drink tea?』字样:
$nl /etc/passwd |sed '3,28d'|sed '2a drink tea'
输入之后,输出如下:
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
drink tea
29 polkituser:x:107:115:PolicyKit,,,:/var/run/PolicyKit:/bin/false
30 haldaemon:x:108:116:Hardware abstraction layer,,,:/var/run/hald:/bin/false
31 gdm:x:109:117:Gnome Display Manager:/var/lib/gdm:/bin/false
例5:在例1的基础上,在第2行前(亦即是加在第2行)加上『drink tea?』字样:
$ nl /etc/passwd |sed '3,28d'|sed '2i drink tea'
输入之后,输出如下:
1 root:x:0:0:root:/root:/bin/bash
drink tea
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
29 polkituser:x:107:115:PolicyKit,,,:/var/run/PolicyKit:/bin/false
30 haldaemon:x:108:116:Hardware abstraction layer,,,:/var/run/hald:/bin/false
31 gdm:x:109:117:Gnome Display Manager:/var/lib/gdm:/bin/false
例6:在/etc/passwd 的第2行后面加入2行字,例如『Drink tea or .....』『drink beer?』:
$nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
输入之后,输出如下:
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
...后面内容由于篇幅原因省略...
注意这里,'\'后面要紧接着回车才行。我们可以新增不只一行,但是每一行之间都必须要以反斜线 \ 来
进行新行的增加。
例7:将/etc/passwd 的第3-28行的内容取代成为『No 3-28 number』:
$nl /etc/passwd | sed '3,28c No 3-28 number'
输入之后,输出如下:
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
No 3-28 number
29 polkituser:x:107:115:PolicyKit,,,:/var/run/PolicyKit:/bin/false
30 haldaemon:x:108:116:Hardware abstraction layer,,,:/var/run/hald:/bin/false
31 gdm:x:109:117:Gnome Display Manager:/var/lib/gdm:/bin/false
例8:仅列出/etc/passwd 的第 5-7 行:
$nl /etc/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'参数,否则输出如下:
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
...由于篇幅原因,省略...
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 polkituser:x:107:115:PolicyKit,,,:/var/run/PolicyKit:/bin/false
...由于篇幅原因,省略...
由此可知,'-n'选项使得仅显示sed处理过的行。
例9:仅显示ifconfig结果中eth0的IP:
设命令"$ifconfig"的输出如下:
eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
那么我们用以下输入:
$ifconfig eth0|grep 'inet'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g'
输入之后,输出如下:
192.168.1.12
这里,将每个管线 '|' 的过程都分开来执行,(1)先用ifconfig eth0列出输出(2)用grep获得有inet的行
(3)用sed 's/^.*addr://g'把grep获得的行去掉ip地址前面的部分(4)用sed 's/Bcast.*$//g'去掉ip地址后面的部分。
例10:将 /etc/man.config 档案的内容中,有 MAN 的设定就取出来,但不要说明内容:
$cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' |sed '/^$/d'
注意,每一行当中,若有 # 表示该行为批注,但是要注意的是,有时候,批注并不是写在第一个字符,亦即是写在某个指令后方,如下的模样:『shutdown -h now # 这个是关机的指令』,批注 # 就在指令的后方了。因此,我们才会使用到将 #.*$ 这个正规表示法。sed '/^$d'是什么意思???????
例11:利用 sed 直接在 ~/.bashrc 最后一行加入『# This is a test』
sed -i '$a # This is a test' ~/.bashrc
注意:-i 参数可以让你的 sed 直接去修改后面接的档案内容,$a 则代表最后一行才新增的意思,结果导致新增一行,如果没有-i,则将~/.bashrc全部显示并追加#This is a test,但是并不改变文件内容。
【描述】
参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。(见例8)
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i :直接修改读取的档案内容,而不是由屏幕输出(见例11)。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)。
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何字符;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作。(见例8)
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 。