《老段帶你學sed(上)》筆記

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 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字符

[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文件














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章