行操作的行数,比如我的操作需要在10到20行之间进行,则写为10, 20[操作名称]
。
具体地,对行的操作函数function
包括下面这些东西:
a
:新增,a
的后面可以接字符,这些字符将被添加在n1
/n2
的下一行;
c
:替换,c
的后面可以接字符,这些字符可以替换n1
,n2
之间的行;
d
:删除,因为是删除,所以d
后面通常不需要接任何东西;
i
:插入,i
的后面可以接字符,这些字符将被添加在n1
/n2
的上一行;
p
:打印,亦即将某些选择的行打印出来。通常p
会与参数sed -n
一起运行。
s
:替换,可以直接进行替换的工作,通常这个s
的操作可以搭配正则表达式。
下面我们来举几个例子进行说明。
以行为单位的新增/删除功能
范例一:查看/etc/passwd
文件的内容并且在每一行前面加上行号,同时将2-5
行删除。
root@orion-orion:~ cat -n /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/zsh
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
...
可以看到sed
的操作为2,5d
,也即删除2~5行,所以显示的数据就没有2~5行。此外,请注意原本应该是要执行sed -e
才对,不过这里没有-e
也行,因为已经默认选了。同时也要注意sed
后面接的操作务必以两个单引号''
括住。
我们将范例变一下,如果要删除第2行,那么可以使用cat -n /etc/passwd | sed '2d'
;如果是要删除第3到最后一行,则是cat -n /etc/passwd | sed '3,$d'
,这里美元符号$
代表最后一行。
范例二: 承接上题,在第2行后(亦即是第3行)加上drink tea
字样。
root@orion-orion:~ cat -n /etc/passwd | sed '2a Drink tea?'
1 root:x:0:0:root:/root:/bin/zsh
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Drink tea?
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
如果想要加在第2行前面,将新增操作改为插入操作,即cat -n /etc/passwd | sed '2i Drink tea?'
就行了。
范例三:继续承接上题,现在我们想要在第2行后面加上两行字,例如Drink tea or...
与Drink beer?
root@orion-orion:~ cat -n /etc/passwd | sed '2a Drink tea or...\
\ Drink beer?'
1 root:x:0:0:root:/root:/bin/zsh
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Drink tea or...
Drink beer?
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
这里的重点在于我们可以不只增加一行,可以增加很多行,但每一行之间必须以反斜杠\
来进行新行的增加。
以行为单位的替换与显示功能
刚刚是介绍如何新增与删除行。接下来我们看看如何进行整行的替换。
范例四:我想将2~5行的内容替换为No 2-5 number
。
root@orion-orion:~ cat -n /etc/passwd | sed '2,5c No 2-5 number`
1 root:x:0:0:root:/root:/bin/zsh
No 2-5 number
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
...
除此之外,sed
还有很有趣的功能,以前我们想要列出第11~25行,得用head -n 20
或tail -n 10
之类的命令来处理,很麻烦。而sed
则可以直接取出你想要的那几行,这是通过行号来识别的。例如下面这个范例:
范例五:仅列出/etc/passwd
文件内的第5-7行。
root@orion-orion:~ cat -n /etc/passwd | sed -n '5,7p'
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
注意,这里必须要加-n
表示安静模式。如果不加-n
改为sed 5,7p
,那么第5-7行会重复输出:
root@orion-orion:~ cat -n /etc/passwd | sed '5,7p'
1 root:x:0:0:root:/root:/bin/zsh
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
...
部分数据的查找并替换的功能
除了整行的处理模式之外,sed
还可以对某行进行部分数据的查找和替换。基本上sed
的查找与替换与vi
相当的类似,它的格式如下所示:
sed 's/要被替换的字符/新的字符/g'
接下来我们来看一个取得IP数据的范例,我们将该任务拆解为多步,一段一段地处理。
步骤一:先观察原始信息,利用/sbin/ifconfig
查询IP是什么?
root@orion-orion:~ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:0c
inet addr:172.17.0.12 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:49498631 errors:0 dropped:0 overruns:0 frame:0
TX packets:41131666 errors:0 dropped:0 overruns:0 carrier:0
collisions: