工作原理:
简单的来说,Sed一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
语法:
sed [option] [script'(sed自带语法脚本)] [input-file处理的文件]
sed [选项] + "地址+命令 " file
常用option参数(+描述):
Script:
地址+命令
地址:
1.不给地址:对全文进行处理;
2.单地址:
#:指定的行(1p,2p...);
/pattern/:被模式匹配匹配到的字串行;
3.范围地址:
#,#:第几行只第几行(1,2p);
#,+#:从第#行起始向后+#行;
/pat1/,/pat2/:模式1匹配 所在行至模式2匹配所在行;
#,/pat/:第几行只模式匹配行;
4.~:步进
1~2:奇数行
2~2:偶数行
编辑命令:
sed查找替换:
s///:查找替换(分隔符):
s@@@
s###
替换标记:
g:行内全局替换;
p:显示替换成功的行;
w /PATH/TO/Somefile:将替换成功的行报错至文件中;
操作原文件:
[root@linuxidc ~]# cat -n Test.txt
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
匹配打印(p):
#打印匹配root开头的行:
#每一行都读到模式空间,不加-n参数默认进行输出,这里看到root:x:0:0:root:/root:/bin/bash输出两行
[root@linuxidc ~]# cat Test.txt | sed '/^root/p'
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@linuxidc ~]# tail Test.txt | sed -n '/^root/p'
root:x:0:0:root:/root:/bin/bash
#打印包含root的行:
[root@linuxidc ~]# cat -n Test.txt | sed -n '/root/p'
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
#打印第二行:
[root@linuxidc ~]# cat -n Test.txt | sed -n '2p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@linuxidc ~]#
#打印第一行到,第三行:
[root@linuxidc ~]# cat -n Test.txt | sed -n '1,3p'
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
#打印第三行起始后三行:
[root@linuxidc ~]# cat -n Test.txt | sed -n '3,+3p'
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
#打印以nologin结尾的行:(匹配)
[root@linuxidc ~]# cat -n Test.txt | sed -n '/nologin$/p'
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#打印root开头行至daemon开头行
[root@linuxidc ~]# sed -n '/^root/,/^daemon/p' Test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#打印最后一行
[root@linuxidc ~]# cat -n Test.txt | sed -n '$p'
10 operator:x:11:0:operator:/root:/sbin/nologin
#不打印最后一行:(“!”表示取反)
[root@linuxidc ~]# cat -n Test.txt | sed -n '$!p'
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#打印奇数行
[root@linuxidc ~]# cat -n Test.txt |sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#打印偶数行
[root@linuxidc ~]# cat -n Test.txt |sed -n '2~2p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
#引用变量:sed命令使用单引号:变量用单引号引起来,sed命令使用双引号,解释特殊符号原有意义
[root@linuxidc ~]# a=1
[root@linuxidc ~]# b=2
[root@linuxidc ~]# cat -n Test.txt | sed -n ''$a','$b'p'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@linuxidc ~]# cat -n Test.txt | sed -n "$a,"$b"p"
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
匹配删除(d):
#删除匹配root行
[root@linuxidc ~]# cat -n Test.txt | 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
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#删除第二行
[root@linuxidc ~]# cat -n Test.txt | sed '2d'
1 root:x:0:0:root:/root:/bin/bash
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#删除1至9行
[root@linuxidc ~]# cat -n Test.txt | sed '1,9d'
10 operator:x:11:0:operator:/root:/sbin/nologin
#删除偶数行
[root@linuxidc ~]# cat -n Test.txt | sed '2~2d'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#删除配置文件中以(#开头的行和空行):
[root@linuxidc ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
替换(s///):
#替换root字符串为ROOT,s///:只是替换每行中第一个匹配到的字符串
[root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/'
1 ROOT:x:0:0:root:/root:/bin/bash #第一行中只有第一个root替换成ROOT
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/ROOT:/sbin/nologin #唯一一个root
#全局替换root字符串为ROOT,s///g
[root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/g'
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/ROOT:/sbin/nologin
#正则匹配
[root@linuxidc ~]# sed -n 's/^root/ROOT/p' Test.txt
ROOT:x:0:0:root:/root:/bin/bash
#分组使用:取出基本名,目录名
[root@linuxidc ~]# dirname /etc/sysconfig/sshd
/etc/sysconfig
[root@linuxidc ~]# basename /etc/sysconfig/sshd
sshd
[root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\1#'
/etc/sysconfig/
[root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\2#'
sshd
#使用&命令引用匹配内容并且替换,
#注:&代表root,&.1:把root替换成root.1
[root@linuxidc ~]# cat -n Test.txt |sed 's/root/&.1/g'
1 root.1:x:0:0:root.1:/root.1:/bin/bash
......
#为1,2行添加注释
[root@linuxidc ~]# cat -n Test.txt |sed '1,2s/^/#/'
# 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
多点编辑(-e):
[root@linuxidc ~]# cat -n Test.txt |sed -e '4,5d' -e 's/root/ROOT/g'
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
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 operator:x:11:0:operator:/ROOT:/sbin/nologin
添加/追加内容(a,i,c):
#i:在搜索匹配到的上一行添加
[root@linuxidc ~]# cat -n Test.txt | sed '/root/i \Root'
Root
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
......
#a:在搜索匹配的下一行添加
[root@linuxidc ~]# cat -n Test.txt | sed '/root/a \Root'
1 root:x:0:0:root:/root:/bin/bash
Root
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
#c:替换搜索匹配的行
[root@linuxidc ~]# cat -n Test.txt | sed '/root/c \Root'
Root
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
注:同样可以指定地址单行添加,指定地址范围添加......
保存模式匹配的行至指定文件(w):
#匹配1,2行追加Test1
[root@linuxidc ~]# cat -n Test.txt | sed '1,2w Test1'
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@linuxidc ~]# cat Test1
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
读取指定文件的文本追加至模式空间(r):
#读取/etc/RedHat-release,追加至1,2行
[root@linuxidc ~]# cat -n Test.txt | sed '1,2r /etc/redhat-release'
1 root:x:0:0:root:/root:/bin/bash
CentOS Linux release 7.2.1511 (Core)
2 bin:x:1:1:bin:/bin:/sbin/nologin
CentOS Linux release 7.2.1511 (Core)
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
匹配到的行号:
#=:
[root@linuxidc ~]# cat -n Test.txt | sed -n '/root/='
1
10
#!:同之前可以
原文件编辑(i):
[root@linuxidc ~]# sed -i 's/adm/ADM/g' Test.txt
[root@linuxidc~]# cat Test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ADM:x:3:4:ADM:/var/ADM:/sbin/nologin
......
注意:由于-i参数修改原配置文件,操作比较危险,可以使用-i.bak执行,生成源文件.bak就是之前没有改动的文件(bak是自己制定,随意指定)。
[root@linuxidc ~]# sed -i.bak '1,7d' Test.txt
[root@linuxidc ~]# cat Test.txt
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@linuxidc ~]# cat Test.txt.bak #原文件备份
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ADM:x:3:4:ADM:/var/ADM:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
空间操作:
#取出偶数行:
[root@linuxidc ~]# cat -n Test.txt | sed -n 'n;p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
#取出奇数行:
[root@linuxidc ~]# cat -n Test.txt | sed 'n;d'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#倒叙显示:
[root@linuxidc ~]# cat -n Test.txt |sed -n '1!G;h;$p'
10 operator:x:11:0:operator:/root:/sbin/nologin
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
8 halt:x:7:0:halt:/sbin:/sbin/halt
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
6 sync:x:5:0:sync:/sbin:/bin/sync
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
#打印文件最后一行:
[root@linuxidc ~]# sed 'N;D' Test.txt
operator:x:11:0:operator:/root:/sbin/nologin
#在每行后增加空行:
[root@linuxidc ~]# sed 'G' Test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin