1、sed工作流程
文件aa,首先读取文件第一行,不管你是操作还是不操作,把结果输出在屏幕上,然后再读取第二行内容督导内存中去执行,读取每行的时候都是读到内存中的,模式空间。即使文件很大,不会消耗的内存空间。在模式空间里执行命令。
2、sed语法
sed ‘范围(条件) 命令’file 满足条件才执行命令,默认不满足条件也显示结果
d:删
[root@mail ~]# sed 'd' 1.log [root@mail ~]# //没有显示,因为读取一行删除一行
范围:使用数字,表示第多少行。使用“,”号,从第几行到第几行。$最后一行。~间隔
[root@mail ~]# cat -n 2.log |sed '5d' //删除第五行
1 PID TTY TIME CMD
2 1 ? 00:00:01 init
3 2 ? 00:00:00 kthreadd
4 3 ? 00:00:00 migration/0
6 5 ? 00:00:00 migration/0
7 6 ? 00:00:00 watchdog/0
8 7 ? 00:00:02 events/0
9 8 ? 00:00:00 cgroup
10 9 ? 00:00:00 khelper[root@mail ~]# cat -n 2.log |sed '5,10d' //删除第5到第10行
1 PID TTY TIME CMD
2 1 ? 00:00:01 init
3 2 ? 00:00:00 kthreadd
4 3 ? 00:00:00 migration/0[root@mail ~]# cat -n 2.log |sed '$d' //删除最后一行
1 PID TTY TIME CMD
2 1 ? 00:00:01 init
3 2 ? 00:00:00 kthreadd
4 3 ? 00:00:00 migration/0
5 4 ? 00:00:00 ksoftirqd/0
6 5 ? 00:00:00 migration/0
7 6 ? 00:00:00 watchdog/0
8 7 ? 00:00:02 events/0
9 8 ? 00:00:00 cgroup[root@mail ~]# cat -n 2.log |sed '1 ~ 2 d' //第一行开始,间隔为2删除
2 1 ? 00:00:01 init
4 3 ? 00:00:00 migration/0
6 5 ? 00:00:00 migration/0
8 7 ? 00:00:02 events/0
10 9 ? 00:00:00 khelper正则表达式://引起来,满足条件就执行命令
[root@mail ~]# cat 3.txt root mysql mysql sad aaatom tom fds dddd tom [root@mail ~]# sed '/tom/d' 3.txt //删除包含tom的行 root mysql mysql sad dddd [root@mail ~]# sed '/^tom/,/tom$/d' 3.txt //删除以tom开头和tom结尾的行 root mysql mysql sad [root@mail ~]# sed '/\btom\b/d' 3.txt //删除包含tom单词的行删除 root mysql mysql sad aaatom dddd
s:替换 s/old/new/标签 old部分是可以使用正则的,new部分不能使用正则
[root@mail ~]# sed 's/tom/TOM/' 3.txt //只替换第一个tom root mysql mysql sad aaaTOM TOM fds tom dddd TOM [root@mail ~]# sed 's/tom/TOM/2' 3.txt //替换第二个tom root mysql mysql sad aaatom tom fds TOM dddd tom [root@mail ~]# sed 's/tom/TOM/g' 3.txt //替换所有tom root mysql mysql sad aaaTOM TOM fds TOM dddd TOM
[root@mail ~]# sed -n 's/tom/TOM/g' 3.txt //关闭默认输出 [root@mail ~]# sed -n 's/tom/TOM/gp' 3.txt //操作的内容就打印出来 aaaTOM TOM fds TOM TOM
[root@mail ~]# sed 's/[t|T][o|O][m|M]/TOM/g' 3.txt //可以使用[] root mysql mysql sad aaaTOM TOM TOM fds TOM dddd TOM
修改配置文件
[root@mail ~]# sed -n 's/#ServerName www.example.com:80/#ServerName '$aa'/p' /etc/httpd/conf/httpd.conf #ServerName [root@mail ~]# sed -n "s/#ServerName www.example.com:80/#ServerName $aa/p" /etc/httpd/conf/httpd.conf #ServerName
[root@mail ~]# sed -n 's&/sbin/nologin&/bin/bash&gp' passwd //可将/替换成任意字符 bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:daemon:/sbin:/bin/bash adm:x:3:4:adm:/var/adm:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/bin/bash mail:x:8:12:mail:/var/spool/mail:/bin/bash uucp:x:10:14:uucp:/var/spool/uucp:/bin/bash [root@mail ~]# sed -n 's</sbin/nologin</bin/bash<gp' passwd bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:daemon:/sbin:/bin/bash adm:x:3:4:adm:/var/adm:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/bin/bash mail:x:8:12:mail:/var/spool/mail:/bin/bash uucp:x:10:14:uucp:/var/spool/uucp:/bin/bash
[root@mail ~]# sed -n '4{s/aaa/AAA/gp; s/tom/TOM/gp}' 3.txt
AAAtom TOm
AAATOM TOm
//先执行第一条命令再执行第二条命令
[root@mail ~]# sed -n '4{s/aaa/AAA/gp; s/AAA/aaa/gp}' 3.txt
AAAtom TOm
aaatom TOm& 表示old字符
[root@mail ~]# sed 's/tom/--&--/g' 3.txt root mysql mysql sad aaa--tom-- TOm --tom-- fds --tom-- dddd --tom--
\U 把后面所有字符变成大写
[root@mail ~]# sed 's/tom/hhh\Uhhhh/g' 3.txt root mysql mysql sad aaahhhHHHH TOm hhhHHHH fds hhhHHHH dddd hhhHHHH
[root@mail ~]# cat 4.txt
[myshare]
comment = Public Stuff
path = /home/samba
public = no
writable = yes
browseable = yes
[root@mail ~]# sed -n 's/\[.*\]/\U&/gp' 4.txt //将[]内的全部变成大写
[MYSHARE]\u 把后面第一个字符变成大写
[root@mail ~]# sed 's/tom/hhh\uhhhh/g' 3.txt root mysql mysql sad aaahhhHhhh TOm hhhHhhh fds hhhHhhh dddd hhhHhhh
\L 把后所有的字符都变成小写的
[root@mail ~]# sed 's/tom/TTT\LTTTT/g' 3.txt root mysql mysql sad aaaTTTtttt TOm TTTtttt fds TTTtttt dddd TTTtttt
\l 把后面第一个字符变成小写
[root@mail ~]# sed 's/tom/TTT\lTTTT/g' 3.txt root mysql mysql sad aaaTTTtTTT TOm TTTtTTT fds TTTtTTT dddd TTTtTTT
\E 代表终止
[root@mail ~]# sed 's/tom/ggg\Ugg\Egg/g' 3.txt root mysql mysql sad aaagggGGgg TOm gggGGgg fds gggGGgg dddd gggGGgg
分组:在old相应的位置使用(),第一个()对应\1,第二个()对应\2
[root@mail ~]# sed -n 's/#\(ServerName\)/\1/p' /etc/httpd/conf/httpd.conf ServerName www.example.com:80 [root@mail ~]# sed -n 's/\(#\)\(ServerName\)/\2/p' /etc/httpd/conf/httpd.conf ServerName www.example.com:80
a:在指定行的下一行添加一行
[root@mail ~]# sed '$ a cat cat tom' 3.txt root mysql mysql sad aaatom TOm tom fds tom dddd tom cat cat tom [root@mail ~]# sed '2 a cat cat tom' 3.txt //指定第二行的下一行 root mysql cat cat tom mysql sad aaatom TOm tom fds tom dddd tom
i:在指定行的上一行添加一行
[root@mail ~]# sed '2 i cat cat tom' 3.txt root cat cat tom mysql mysql sad aaatom TOm tom fds tom dddd tom
c:替换,把满足条件的行替换
[root@mail ~]# sed '/mysql/c apache' 3.txt root apache apache aaatom TOm tom fds tom dddd tom
[root@mail ~]# sed -n '/^#ServerName/c ServerName '$aa'' /etc/httpd/conf/httpd.conf ServerName
y:替换,y/abc/XYZ/ 将所有的a、b、c分别换成对应的X、Y、Z
[root@mail ~]# sed 'y/tom/TOM/' 3.txt rOOT Mysql Mysql sad aaaTOM TOM TOM fds TOM dddd TOM
i:对源文件进行修改,不要使用-n和-p,否则只会输出修改的内容
[root@mail ~]# sed -i.xx 'y/tom/TOM/' 3.txt //修改文件同时进行备份成.xx文件
















