一、sed工做流程
mysql
文件aa,首先读取文件第一行,无论你是操做仍是不操做,把结果输出在屏幕上,而后再读取第二行内容督导内存中去执行,读取每行的时候都是读到内存中的,模式空间。即便文件很大,不会消耗的内存空间。在模式空间里执行命令。正则表达式
二、sed语法sql
sed ‘范围(条件) 命令’file 知足条件才执行命令,默认不知足条件也显示结果apache
d:删bash
[root@mail ~]# sed 'd' 1.log [root@mail ~]# //没有显示,由于读取一行删除一行
范围:使用数字,表示第多少行。使用“,”号,从第几行到第几行。$最后一行。~间隔ide
[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
正则表达式://引发来,知足条件就执行命令atom
[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 mail.test.com [root@mail ~]# sed -n "s/#ServerName www.example.com:80/#ServerName $aa/p" /etc/httpd/conf/httpd.conf #ServerName mail.test.com
[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字符
it
[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 mail.test.com
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文件