sed 工具
在了解了一些正規(guī)表示法的基礎(chǔ)應(yīng)用之后,再來(lái)呢?呵呵~兩個(gè)東西可以玩一玩的,那就是 sed 跟底下會(huì)介紹的 awk 了! 這兩個(gè)家伙可是相當(dāng)?shù)挠杏玫陌?#xff01;舉例來(lái)說(shuō),鳥哥寫的?logfile.sh 分析登錄檔的小程序?(第十九章會(huì)談到),絕大部分分析關(guān)鍵字的取用、統(tǒng)計(jì)等等,就是用這兩個(gè)寶貝蛋來(lái)幫我完成的!那么你說(shuō),要不要玩一玩啊?^_^
我們先來(lái)談一談 sed 好了, sed 本身也是一個(gè)管線命令,可以分析 standard input 的啦! 而且 sed 還可以將數(shù)據(jù)進(jìn)行取代、刪除、新增、擷取特定行等等的功能呢!很不錯(cuò)吧~ 我們先來(lái)了解一下 sed 的用法,再來(lái)聊他的用途好了!
| [root@www ~]# sed [-nefr] [動(dòng)作] 選項(xiàng)與參數(shù): -n :使用安靜(silent)模式。在一般 sed 的用法中,所有來(lái)自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到螢?zāi)簧稀5绻由?-n 參數(shù)后,則只有經(jīng)過(guò)sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來(lái)。 -e :直接在命令列模式上進(jìn)行 sed 的動(dòng)作編輯; -f :直接將 sed 的動(dòng)作寫在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動(dòng)作; -r :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語(yǔ)法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語(yǔ)法) -i :直接修改讀取的文件內(nèi)容,而不是由螢?zāi)惠敵觥?dòng)作說(shuō)明: [n1[,n2]]function n1, n2 :不見得會(huì)存在,一般代表『選擇進(jìn)行動(dòng)作的行數(shù)』,舉例來(lái)說(shuō),如果我的動(dòng)作是需要在 10 到 20 行之間進(jìn)行的,則『 10,20[動(dòng)作行為] 』function 有底下這些咚咚: a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~ c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行! d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行); p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~ s :取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦! |
- 以行為單位的新增/刪除功能
sed 光是用看的是看不懂的啦!所以又要來(lái)練習(xí)了!先來(lái)玩玩刪除與新增的功能吧!
| 范例一:將 /etc/passwd 的內(nèi)容列出并且列印行號(hào),同時(shí),請(qǐng)將第 2~5 行刪除! [root@www ~]# nl /etc/passwd | sed '2,5d'1 root:x:0:0:root:/root:/bin/bash6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(后面省略)..... |
看到了吧?sed 的動(dòng)作為 '2,5d' ,那個(gè) d 就是刪除!因?yàn)?2-5 行給他刪除了,所以顯示的數(shù)據(jù)就沒(méi)有 2-5 行羅~ 另外,注意一下,原本應(yīng)該是要下達(dá) sed -e 才對(duì),沒(méi)有 -e 也行啦!同時(shí)也要注意的是, sed 后面接的動(dòng)作,請(qǐng)務(wù)必以 '' 兩個(gè)單引號(hào)括住喔!
如果題型變化一下,舉例來(lái)說(shuō),如果只要?jiǎng)h除第 2 行,可以使用『 nl /etc/passwd | sed '2d' 』來(lái)達(dá)成, 至於若是要?jiǎng)h除第 3 到最后一行,則是『 nl /etc/passwd | sed '3,$d' 』的啦,那個(gè)錢字號(hào)『 $ 』代表最后一行!
| 范例二:承上題,在第二行后(亦即是加在第三行)加上『drink tea?』字樣! [root@www ~]# nl /etc/passwd | sed '2a drink tea'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin drink tea3 daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(后面省略)..... |
嘿嘿!在 a 后面加上的字串就已將出現(xiàn)在第二行后面羅!那如果是要在第二行前呢?『 nl /etc/passwd | sed '2i drink tea' 』就對(duì)啦!就是將『 a 』變成『 i 』即可。 添加一行很簡(jiǎn)單,那如果是要增將兩行以上呢?
| 范例三:在第二行后面加入兩行字,例如『Drink tea or .....』與『drink beer?』 [root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\ > drink beer ?'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin Drink tea or ...... drink beer ?3 daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(后面省略)..... |
這個(gè)范例的重點(diǎn)是『我們可以新增不只一行喔!可以新增好幾行』但是每一行之間都必須要以反斜線『 \ 』來(lái)進(jìn)行新行的添加喔!所以,上面的例子中,我們可以發(fā)現(xiàn)在第一行的最后面就有 \ 存在啦!那是一定要的喔!
- 以行為單位的取代與顯示功能
剛剛是介紹如何新增與刪除,那么如果要整行取代呢?看看底下的范例吧:
| 范例四:我想將第2-5行的內(nèi)容取代成為『No 2-5 number』呢? [root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'1 root:x:0:0:root:/root:/bin/bash No 2-5 number6 sync:x:5:0:sync:/sbin:/bin/sync .....(后面省略)..... |
透過(guò)這個(gè)方法我們就能夠?qū)?shù)據(jù)整行取代了!非常容易吧!sed 還有更好用的東東!我們以前想要列出第 11~20 行, 得要透過(guò)『head -n 20 | tail -n 10』之類的方法來(lái)處理,很麻煩啦~ sed 則可以簡(jiǎn)單的直接取出你想要的那幾行!是透過(guò)行號(hào)來(lái)捉的喔!看看底下的范例先:
| 范例五:僅列出 /etc/passwd 文件內(nèi)的第 5-7 行 [root@www ~]# nl /etc/passwd | sed -n '5,7p'5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown |
上述的命令中有個(gè)重要的選項(xiàng)『 -n 』,按照說(shuō)明文件,這個(gè) -n 代表的是『安靜模式』! 那么為什么要使用安靜模式呢?你可以自行下達(dá) sed '5,7p' 就知道了 (5-7 行會(huì)重復(fù)輸出)! 有沒(méi)有加上 -n 的參數(shù)時(shí),輸出的數(shù)據(jù)可是差很多的喔!你可以透過(guò)這個(gè) sed 的以行為單位的顯示功能, 就能夠?qū)⒛骋粋€(gè)文件內(nèi)的某些行號(hào)捉出來(lái)查閱!很棒的功能!不是嗎?
- 部分?jǐn)?shù)據(jù)的搜尋并取代的功能
除了整行的處理模式之外, sed 還可以用行為單位進(jìn)行部分?jǐn)?shù)據(jù)的搜尋并取代的功能喔! 基本上 sed 的搜尋與取代的與 vi 相當(dāng)?shù)念愃?#xff01;他有點(diǎn)像這樣:
| sed 's/要被取代的字串/新的字串/g' |
上表中特殊字體的部分為關(guān)鍵字,請(qǐng)記下來(lái)!至於三個(gè)斜線分成兩欄就是新舊字串的替換啦! 我們使用底下這個(gè)取得 IP 數(shù)據(jù)的范例,一段一段的來(lái)處理給您瞧瞧,讓你了解一下什么是咱們所謂的搜尋并取代吧!
| 步驟一:先觀察原始信息,利用 /sbin/ifconfig 查詢 IP 為何? [root@www ~]# /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略)..... # 因?yàn)槲覀冞€沒(méi)有講到 IP ,這里你先有個(gè)概念即可啊!我們的重點(diǎn)在第二行, # 也就是 192.168.1.100 那一行而已!先利用關(guān)鍵字捉出那一行!步驟二:利用關(guān)鍵字配合 grep 擷取出關(guān)鍵的一行數(shù)據(jù) [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr'inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 當(dāng)場(chǎng)僅剩下一行!接下來(lái),我們要將開始到 addr: 通通刪除,就是像底下這樣: # inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 上面的刪除關(guān)鍵在於『 ^.*inet addr: 』啦!正規(guī)表示法出現(xiàn)! ^_^步驟三:將 IP 前面的部分予以刪除 [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 仔細(xì)與上個(gè)步驟比較一下,前面的部分不見了!接下來(lái)則是刪除后續(xù)的部分,亦即: # 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 此時(shí)所需的正規(guī)表示法為:『 Bcast.*$ 』就是啦!步驟四:將 IP 后面的部分予以刪除 [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100 |
透過(guò)這個(gè)范例的練習(xí)也建議您依據(jù)此一步驟來(lái)研究你的命令!就是先觀察,然后再一層一層的試做, 如果有做不對(duì)的地方,就先予以修改,改完之后測(cè)試,成功后再往下繼續(xù)測(cè)試。以鳥哥上面的介紹中, 那一大串命令就做了四個(gè)步驟!對(duì)吧! ^_^
讓我們?cè)賮?lái)繼續(xù)研究 sed 與正規(guī)表示法的配合練習(xí)!假設(shè)我只要 MAN 存在的那幾行數(shù)據(jù), 但是含有 # 在內(nèi)的注解我不想要,而且空白行我也不要!此時(shí)該如何處理呢?可以透過(guò)這幾個(gè)步驟來(lái)實(shí)作看看:
| 步驟一:先使用 grep 將關(guān)鍵字 MAN 所在行取出來(lái) [root@www ~]# cat /etc/man.config | grep 'MAN' # when MANPATH contains an empty substring), to find out where the cat # MANBIN pathname # MANPATH manpath_element [corresponding_catdir] # MANPATH_MAP path_element manpath_element # MANBIN /usr/local/bin/man # Every automatically generated MANPATH includes these fields MANPATH /usr/man ....(后面省略)....步驟二:刪除掉注解之后的數(shù)據(jù)! [root@www ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g'MANPATH /usr/man ....(后面省略).... # 從上面可以看出來(lái),原本注解的數(shù)據(jù)都變成空白行啦!所以,接下來(lái)要?jiǎng)h除掉空白行[root@www ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | \ > sed '/^$/d' MANPATH /usr/man MANPATH /usr/share/man MANPATH /usr/local/man ....(后面省略).... |
- 直接修改文件內(nèi)容(危險(xiǎn)動(dòng)作)
你以為 sed 只有這樣的能耐嗎?那可不! sed 甚至可以直接修改文件的內(nèi)容呢!而不必使用管線命令或數(shù)據(jù)流重導(dǎo)向! 不過(guò),由於這個(gè)動(dòng)作會(huì)直接修改到原始的文件,所以請(qǐng)你千萬(wàn)不要隨便拿系統(tǒng)配置檔來(lái)測(cè)試喔! 我們還是使用你下載的 regular_express.txt 文件來(lái)測(cè)試看看吧!
| 范例六:利用 sed 將 regular_express.txt 內(nèi)每一行結(jié)尾若為 . 則換成 ! [root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt # 上頭的 -i 選項(xiàng)可以讓你的 sed 直接去修改后面接的文件內(nèi)容而不是由螢?zāi)惠敵鲟?#xff01; # 這個(gè)范例是用在取代!請(qǐng)您自行 cat 該文件去查閱結(jié)果羅!范例七:利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』 [root@www ~]# sed -i '$a # This is a test' regular_express.txt # 由於 $ 代表的是最后一行,而 a 的動(dòng)作是新增,因此該文件最后新增羅! |
sed 的『 -i 』選項(xiàng)可以直接修改文件內(nèi)容,這功能非常有幫助!舉例來(lái)說(shuō),如果你有一個(gè) 100 萬(wàn)行的文件,你要在第 100 行加某些文字,此時(shí)使用 vim 可能會(huì)瘋掉!因?yàn)槲募罅?#xff01;那怎辦?就利用 sed 啊!透過(guò) sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!很棒吧!
總之,這個(gè) sed 不錯(cuò)用啦!而且很多的 shell script 都會(huì)使用到這個(gè)命令的功能~ sed 可以幫助系統(tǒng)管理員管理好日常的工作喔!要仔細(xì)的學(xué)習(xí)呢!
總結(jié)
- 上一篇: 基础正规表示法字符汇整 (charact
- 下一篇: webbench网站压力测试工具的使用方