sed命令的用法

-n:选项不打印文件的所有行

[root@slave ~]# sed '1'p 1                  //不带-n选项,sed会把所匹配的行打印出来, 
root:x:0:0:root:/root:/bin/bash             //所要求的行 
root:x:0:0:root:/root:/bin/bash              // 并且打印整个文本文件 
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/roo*:/sbin/nologin
php-fpm:x:502:502::/home/php-fpm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
nginx:x:495:492:Nginx web server:/var/lib/nginx:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nagios:x:494:491::/var/spool/nagios:/sbin/nologin
nrpe:x:493:490:NRPE user for the NRPE service:/var/run/nrpe:/sbin/nologin
zabbix:x:492:489:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
root
[root@slave ~]# sed -n '1'p 1                       //加上-n后,只打印出所匹配的行 
root:x:0:0:root:/root:/bin/bash
 [root@slave ~]# sed -n '3,6'p 1          //打印出文件中的3,6行 
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/roo*:/sbin/nologin
[root@slave ~]#

[root@slave ~]# sed -n '/root/'p 1       //打印出包含root的行 
root:x:0:0:root:/root:/bin/bash
root
[root@slave ~]#

-e选项:表示执行多个编辑命令

 [root@slave ~]# sed -n -e '/root/'p -e '/nginx/'p 1              //相当于执行两条命令 
root:x:0:0:root:/root:/bin/bash
nginx:x:495:492:Nginx web server:/var/lib/nginx:/sbin/nologin
root
[root@slave ~]# sed -n '/root/'p 1 ; sed -n '/nginx/'p 1          //两条命令的结果和上面加-e的结果是一样的 
root:x:0:0:root:/root:/bin/bash
root
nginx:x:495:492:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@slave ~]# sed '/ROOT/a\wang' 1        //在ROOT后面追加上wang 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
zabbix:x:492:489:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
root
 ROOT
wang

-f选项:只有在调用sed脚本时才起作用

[root@slave ~]# vim 2.sed             //建立一个sed脚本 
#!/bin/sed -f                         //加上-f选项: 
/ROOT/a\               //这里的字母a表示添加。字母i表示插入,字母c修改文本的内容 
usr\
local.
~
~
[root@slave ~]# chmod u+x 2.sed         //添加执行权限 
[root@slave ~]# ./2.sed 1           //执行脚本文件,后面跟上要执行的文件 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/roo*:/sbin/nologin
zabbix:x:492:489:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
root
 ROOT
usr                                                //添加的内容 
local.

sed文本定位

$:在sed命令中表示最后一行 

[root@slave ~]# sed -n '$p' 1
 ROOT
[root@slave ~]# sed -n '1,16!'p 1              //文本共17行,'x,y!'表示匹配不再这范围之间的行 
 ROOT

用行号与关键字匹配

[root@slave ~]# sed -n '/ntp/,$'p 1        //打印从匹配到ntp的行至最后一行 
ntp:x:38:38::/etc/ntp:/sbin/nologin
nagios:x:494:491::/var/spool/nagios:/sbin/nologin
nrpe:x:493:490:NRPE user for the NRPE service:/var/run/nrpe:/sbin/nologin
zabbix:x:492:489:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
root
 ROOT
[root@slave ~]#

 sed表示替换文件:

 s/被替换字符/新字符/[选项]     {选项可为g表示替换文本中所有出现被替换的字符串之处;p表示只打印替换字符,与-n结合;w表示将输出定向到一个文件}

 [root@slave ~]# sed -n 's/ROOT/root/p' 1        //将文件中的ROOT替换为root 
 root
[root@slave ~]#
[root@slave ~]# touch 22       //创建一个文件,文件里写入3个root 
[root@slave ~]# vim 22
  1 root wang root 
  2 root
  3 root
  4
~
[root@slave ~]# sed -n 's/root/user/p' 22         //这样只是把每一行第一个匹配到的字符替换掉 
user wwang root
user
user
[root@slave ~]# sed -n 's/root/user/g'p 22            //替换掉所有匹配到的字符 
user wwang user 
user
user
[root@slave ~]#
[root@slave ~]# sed -n 's/root/user/w 33' 22      //加上w表示把修改后的文件写入到另一个文件中,若文件不存在则sed会自动创立该文件 
[root@slave ~]# cat 33
user wwang root
user
user
[root@slave ~]#

[root@slave ~]# sed '5 q' 1            //匹配到前5行,然后退出 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@slave ~]#
[root@slave ~]# sed -n -e '/root/=' 1     //打印匹配到关键字所在的行号 
1
16
[root@slave ~]# sed -n -e '/root/=' -e '/root/'p 1         //打印匹配到关键字的行及行号 
1
root:x:0:0:root:/root:/bin/bash
16
root
[root@slave ~]# sed -n '/root/{p;=}' 1         //添加花括号,指定再在位行上所执行的命令组 
root:x:0:0:root:/root:/bin/bash
1
root
16
[root@slave ~]#