Linux sed命令的使用
1.功能簡介
sed(Stream EDitor)是一種流文件編輯器,它一次處理一行內(nèi)容。處理時,把當前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(Pattern Space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕,接著處理下一行,直到文件末尾。文件內(nèi)容并沒有改變,除非使用-i選項。sed主要用來編輯一個或多個文件,簡化對文件的反復操作或者用來編寫轉(zhuǎn)換程序等。
sed功能同awk類似,差別在于,sed簡單,對列處理的功能要差一些,awk功能復雜,對列處理的功能比較強大。
2.命令格式
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
其中OPTION為命令選項,script-only-if-no-other-script為處理動作,可以由-e指定多個,input-file為輸入文件,可以指定多個。
3.選項說明
選項: -n,--quiet,--silent:使用安靜模式。sed的一般用法中,所有來自STDIN的數(shù)據(jù)一般都會被打印到終端上,如果加上-n后,則只有經(jīng)過sed特殊處理的那一行才會被列出來。 -e <script>,--expression=<script>:指定sed動作,可以由多個-e指定多個動作。 -f <script-file>,--file=<script-file>:直接將sed的動作寫在一個文件內(nèi),-f filename則可以運行filename 內(nèi)的sed動作; -r,--regexp-extended:sed支持擴展正則表達式(默認是基礎正則表達式)。 -i :直接修改讀取的文件內(nèi)容,而不是輸出到終端。 --help:顯示幫助。 --version:顯示版本。 動作說明:[n1[,n2]]function n1, n2 :不見得會存在,一般代表“選擇進行動作的行數(shù)”,舉例來說,如果我的動作是需要在 10 到 20 行之間進行,則寫作“10,20動作行為”。 function: a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的下一行)~ c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行! d :刪除,因為是刪除啊,所以 d 后面通常不接任何內(nèi)容; i :插入, i 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的上一行); p :列印,亦即將某個選擇的數(shù)據(jù)印出。通常 p 會與參數(shù) sed -n 一起運行~ s :替換,通常這個s的動作可以搭配正規(guī)表示法!例如 1,20s/old/new/g。
4.典型示例
4.1刪除行操作
(1)將 /etc/passwd 的內(nèi)容列出并且列印行號,同時,請將第 2~5 行刪除。
[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2,5d' root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(后面省略).....
注意:原本應該是要下達 sed -e 才對,當只有一個動作的時候,沒有 -e 也行,但是多于一個動作時必須要使用-e選項來指定動作。同時也要注意的是, sed 后面接的動作,請務必以兩個單引號括住。
(2)只要刪除第 2 行。
nl /etc/passwd | sed '2d'
(3)要刪除第 3 到最后一行
nl /etc/passwd | sed '3,$d'
4.2新增行操作
(1)在第二行后加上”I like drinking tea”。
[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a I like drinking tea' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin I like drinking tea daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(后面省略).....
(2)那如果是要在第二行前加入。
nl /etc/passwd | sed '2i drink tea' //或 nl /etc/passwd | sed '1a drink tea'
(3)在第二行后面加入兩行,”I like drinking tea”與”I like drinking beer”。
[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a I like drinking tea\nI like drinking beer' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin I like drinking tea I like drinking beer daemon:x:2:2:daemon:/sbin:/sbin/nologin …(后面省略)…
或者每一行使用反斜杠\來分開,就可以在命令行中將一條命令分開多行輸入,如下:
[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a I like drinking tea\ > I like drinking beer'
4.3替換行操作
(1)將第2-5行的內(nèi)容替換成為”No 2-5 number”。
[b3335@MIC ~]$ nl -nln /etc/passwd | sed '2,5c No 2-5 number' root:x:0:0:root:/root:/bin/bash No 2-5 number sync:x:5:0:sync:/sbin:/bin/sync .....(后面省略).....
4.4選擇行打印
(1)僅列出 /etc/passwd 文件內(nèi)的第 5-7 行。
[root@www ~]# nl -nln /etc/passwd | sed -n '5,7p' lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
4.5數(shù)據(jù)的查找并進行相關(guān)操作
(1)數(shù)據(jù)的查找并顯示
搜索 /etc/passwd有root關(guān)鍵字的行并輸出。
[b3335@MIC ~]$ nl /etc/passwd | sed -n '/root/p' root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
(2)數(shù)據(jù)的查找并刪除
刪除/etc/passwd所有包含root的行,其他行輸出。
[b3335@MIC ~]$ nl /etc/passwd | sed '/root/d' daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh …(下面忽略)…
如果想刪除匹配的字符串,使用如下命令:
[b3335@MIC ~]$ nl /etc/passwd | sed 's/root//g'
(3)數(shù)據(jù)的查找并替換
除了整行的處理模式之外, sed 還可以用行為單位進行部分數(shù)據(jù)的搜尋并取代。基本上 sed 的搜尋與替代的與 vi 相當?shù)念愃?!他有點像這樣:
sed 's/被取代的字串/新的字串/g'
(4)數(shù)據(jù)的搜尋并執(zhí)行命令
搜索/etc/passwd,找到root對應的行,執(zhí)行后面花括號中的一組命令,每個命令之間用分號分隔,這里把bash替換為blueshell,再輸出這行:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}' root:x:0:0:root:/root:/bin/blueshell
如果只替換/etc/passwd的第一個bash關(guān)鍵字為blueshell,就退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' root:x:0:0:root:/root:/bin/blueshell
4.6多點編輯
一條sed命令,刪除/etc/passwd第三行到末尾的數(shù)據(jù),并把bash替換為blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' root:x:0:0:root:/root:/bin/blueshell daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e表示多點編輯,第一個編輯命令刪除/etc/passwd第三行到末尾的數(shù)據(jù),第二條命令搜索bash替換為blueshell。
4.7直接修改文件
sed 可以直接修改文件的內(nèi)容,不必使用管道命令或數(shù)據(jù)流重導向! 不過,由於這個動作會直接修改到原始的文件,所以請你千萬不要隨便拿系統(tǒng)配置來測試,使用時也要慎重。我們使用下載的regular_express.txt 文件來測試看看吧!
利用 sed 將 regular_express.txt 內(nèi)每一行結(jié)尾若為 . 則換成 !
[root@www ~]# sed -i 's/\.$/!/g' regular_express.txt
利用 sed 直接在 regular_express.txt 最后一行加入”# This is a test”。
[root@www ~]# sed -i '$a # This is a test' regular_express.txt
由於 $ 代表的是最后一行,而 a 的動作是新增,因此該文件最后新增”# This is a test”。
sed 的-i
選項可以直接修改文件內(nèi)容,這功能非常有幫助!舉例來說,如果你有一個 100 萬行的文件,你要在第 100 行加某些文字,此時使用 vim 可能會瘋掉!因為文件太大了!那怎辦?就利用 sed ?。⊥高^ sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!
以上就是Linux sed命令的使用的詳細內(nèi)容,更多關(guān)于Linux sed命令的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。