一、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文件