linux三劍客--sed-學(xué)習(xí)版

一、前言

我們都知道安皱,在Linux中一切皆文件调鬓,比如配置文件,日志文件酌伊,啟動文件等等腾窝。如果我們相對這些文件進(jìn)行一些編輯查詢等操作時,我們可能會想到一些vi,vim,cat,more等命令居砖。但是這些命令效率不高虹脯,這就好比一塊空地準(zhǔn)備搭建房子,請了10個師傅拿著鐵鍬挖地基奏候,花了一個月的時間才挖完循集,而另外一塊空地則請了個挖土機(jī),三下五除二就搞定了蔗草,這就是效率咒彤。而在linux中的“挖土機(jī)”有三種型號:頂配awk,中配sed咒精,標(biāo)配grep镶柱。使用這些工具,我們能夠在達(dá)到同樣效果的前提下節(jié)省大量的重復(fù)性工作模叙,提高效率歇拆。

sed 是Stream Editor(字符流編輯器)的縮寫,簡稱流編輯器。什么是流故觅?大家可以想象以下流水線厂庇,sed就像一個車間一樣,文件中的每行字符都是原料输吏,運(yùn)到sed車間宋列,然后經(jīng)過一系列的加工處理,最后從流水線下來就變成貨物了评也。

編輯文件也是這樣炼杖,以前我們修改一個配置文件,需要移動光標(biāo)到某一行盗迟,然后添加點(diǎn)文字坤邪,然后又移動光標(biāo)到另一行,注釋點(diǎn)東西.......可能修改一個配置文件下來需要花費(fèi)數(shù)十分鐘罚缕,還有可能改錯了配置文件艇纺,又得返工。這還是一個配置文件邮弹,如果數(shù)十個數(shù)百個呢黔衡?因此當(dāng)你學(xué)會了sed命令,你會發(fā)現(xiàn)利用它處理文件中的一系列修改是很有用的腌乡。只要想到在大約100多個文件中盟劫,處理20個不同的編輯操作可以在幾分鐘之內(nèi)完成,你就會知道sed的強(qiáng)大了与纽。

二侣签、軟件功能與版本

Sed命令是操作,過濾和轉(zhuǎn)換文本內(nèi)容的強(qiáng)大工具急迂。常用功能有增刪改查(增加影所,刪除,修改僚碎,查詢)猴娩,其中查詢的功能中最常用的2大功能是過濾(過濾指定字符串),取行(取出指定行)勺阐。

我們現(xiàn)在準(zhǔn)備學(xué)習(xí)的sed版本是GNU開源版本

|

1

2

|

[root@chengliang mail]``# sed --version

GNU sed version ``4.2``.``1

|

三卷中、命令執(zhí)行流程

Sed軟件從文件或管道中讀取一行,處理一行皆看,輸出一行仓坞;再讀取一行背零,再處理一行腰吟,再輸出一行....

一次一行的設(shè)計(jì)使得sed軟件性能很高,sed在讀取非常龐大的文件時不會出現(xiàn)卡頓的想象。大家都用過vi命令毛雇,用vi命令打開幾十M或更大的文件嫉称,會發(fā)現(xiàn)有卡頓現(xiàn)象,這是因?yàn)関i命令打開文件是一次性將文件加載到內(nèi)存灵疮,然后再打開织阅,因此卡頓的時間長短就取決于從磁盤到內(nèi)存的讀取速度了。而且如果文件過大的話還會造成內(nèi)存溢出現(xiàn)象震捣。Sed軟件就很好的避免了這種情況荔棉,打開速度非常快蒿赢,執(zhí)行速度也很快润樱。

現(xiàn)有一個文件person.txt,共有五行文本,sed命令讀入文件person.txt的第一行“101羡棵,chensiqi,CEO”,并將這行文本存入模式空間(sed軟件在內(nèi)存中的一個臨時緩存壹若,用于存放讀取到的內(nèi)容,比喻為工廠流水線的傳送帶皂冰。)

文件person.txt在模式空間的完整處理流程

  • 判斷第1行是否是需要處理的行店展,如果不是要處理的行就重新從文件讀取下一行,如果是要處理的行秃流,則接著往下走赂蕴。
  • 對模式空間的內(nèi)容執(zhí)行sed命令,比如a(追加)舶胀,i(插入)睡腿,s(替換)...
  • 將模式空間中經(jīng)過sed命令處理后的內(nèi)容輸出到屏幕上,然后清空模式空間
  • 讀取下一行文本峻贮,然后重新執(zhí)行上面的流程席怪,直到文件結(jié)束

image

sed是非交互式的編輯器。它不會修改文件纤控,除非使用shell重定向來保存結(jié)果挂捻。默認(rèn)情況下,所有的輸出行都被打印到屏幕上船万。

sed編輯器逐行處理文件(或輸入)刻撒,并將結(jié)果發(fā)送到屏幕。具體過程如下:首先sed把當(dāng)前正在處理的行保存在一個臨時緩存區(qū)中(也稱為模式空間)耿导,然后處理臨時緩沖區(qū)中的行声怔,完成后把該行發(fā)送到屏幕上。sed每處理完一行就將其從臨時緩沖區(qū)刪除舱呻,然后將下一行讀入醋火,進(jìn)行處理和顯示悠汽。處理完輸入文件的最后一行后,sed便結(jié)束運(yùn)行芥驳。sed把每一行都存在臨時緩沖區(qū)中柿冲,對這個副本進(jìn)行編輯,所以不會修改原文件兆旬。

Sed軟件有兩個內(nèi)置的存儲空間:

  • 模式空間(pattern space):是sed軟件從文本讀取一行文本然后存入的緩沖區(qū)(這個緩沖區(qū)是在內(nèi)存中的)假抄,然后使用sed命令操作模式空間的內(nèi)容。
  • 保持空間(hold space):是sed軟件另外一個緩沖區(qū)丽猬,用來存放臨時數(shù)據(jù)宿饱,也是在內(nèi)存中,但是模式空間和保持空間的用途是不一樣的脚祟。Sed可以交換保持空間和模式空間的數(shù)據(jù)刑棵,但是不能在保持空間上執(zhí)行普通的sed命令,也就是說我們可以在保持空間存儲數(shù)據(jù)愚铡。

四蛉签、使用規(guī)范文本

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

[root@chengliang zcl]``# cat zcl.txt

[root@chengliang zcl]``# cat > zcl.txt <<KOF

> ``101``,chengliang,aa

> ``102``,alex,bb

> ``103``,eric,cc

> ``104``,laonanhai,dd

> KOF

[root@chengliang zcl]``# cat zcl.txt

101``,chengliang,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

KOF必須成對出現(xiàn),表示終止輸入

命令說明:使用一條cat命令創(chuàng)建多行文本沥寥,文件包含上面的內(nèi)容碍舍,后面的操作都會使用這個文件。

五邑雅、常用功能-增刪改查

1片橡、增

比如我們平時往配置文件寫入幾行文本,最常用的是vi或vim命令淮野,但是這2個命令是一種交互式的命令捧书,還需要我們在vi/vim編輯器界面輸入字符串然后保存退出,操作有些繁瑣但是還能用骤星。但是當(dāng)我們學(xué)會了Shell腳本后经瓷,我們就會發(fā)現(xiàn)在腳本中不能正常使用vi或vim命令,為什么呢洞难?同學(xué)們請自行體驗(yàn)舆吮。

這里我們需要用到2個sed命令,分別是:

  • “a”:追加文本到指定行后队贱,記憶方法:a的全拼是append色冀,意思是追加。
  • “i“:插入文本到指定行前柱嫌,記憶方法:i的全拼是insert锋恬,意思是插入。

在文件中增加一行文本编丘,我們以前學(xué)過echo命令可以在文件的末尾追加文本与学,比較簡單彤悔,但是我們還有其他的復(fù)雜需求,比如在第10行插入一行數(shù)字等等癣防,這里就需要sed出馬了蜗巧。

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed "2a hahaha" zcl.txt

101``,chengliang,aa

102``,alex,bb

hahaha ``#新增的那句

103``,eric,cc

104``,laonanhai,dd

|

引號的區(qū)別總結(jié)

sed使用的過程中用單引號還是雙引號掌眠?這里給大家詳細(xì)說說引號的區(qū)別蕾盯。

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

|

[root@chengliang zcl]``# cat zcl.txt

101``,chengliang,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed '2i $PATH' zcl.txt #單引號--文本內(nèi)容原封不動插入

101``,chengliang,aa

$PATH

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed "2i $PATH" zcl.txt #雙引號--變量$PATH被解析以后在當(dāng)作文本進(jìn)行插入

101``,chengliang,aa

/``application``/``mysql``/``bin``:``/``usr``/``local``/``sbin:``/``usr``/``local``/``bin``:``/``sbin:``/``bin``:``/``usr``/``sbin:``/``usr``/``bin``:``/``root``/``bin

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed 2i $PATH zcl.txt #不加引號,linux無法辨認(rèn)空格蓝丙,不會把有空格的命令當(dāng)成一條命令來執(zhí)行

sed: ``-``e expression ``#1, char 2: expected \ aftera', c' ori'`

[root@chengliang zcl]``#

|

總結(jié):

  • 如果引號里面是普通字符串的話级遭,你可以任意使用單引號或者雙引號:
  • 如果引號里面是變量或者帶反引號的命令的話,你想要變量解析的結(jié)果或者命令執(zhí)行的結(jié)果渺尘,那就使用雙引號挫鸽;你想要引號內(nèi)的原樣字符串,那就使用單引號鸥跟。

添加多行文本

-e enable interpretation of backslash escapes //啟用反斜杠轉(zhuǎn)義解釋

|

1

2

3

4

5

6

7

8

9

|

[root@chengliang zcl]``# echo "zcl";echo "zcl"

zcl

zcl

[root@chengliang zcl]``# echo "zcl\nzcl"

zcl\nzcl

[root@chengliang zcl]``# echo -e "zcl\nzcl"

zcl

zcl

[root@chengliang zcl]``#

|

命令說明:這里就“\n”派上用場了丢郊,行與行之間是以“\n”作為分隔符的,所以“chensiqi\nchensiqi”就等效于2行chensiqi医咨。接下來我們用echo命令實(shí)驗(yàn)一下枫匾,其中-e參數(shù)表示字符串中如果出現(xiàn)以下特殊字符(\n代表換行,\t代表Tab鍵等)拟淮,則加以特殊處理干茉,而不會將它當(dāng)成一般文字輸出。

|

1

2

3

4

5

6

7

8

|

[root@chengliang zcl]``# sed "2a wawawa\nhahaha" zcl.txt

101``,chengliang,aa

102``,alex,bb

wawawa

hahaha

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

當(dāng)然還有另外一種方法添加多行文本很泊,但這種方法并沒有“\n”方便角虫,所以在這里就簡單說一下。這種方法利用了“\”委造,它也有換行的意思戳鹅。如果大家在執(zhí)行一行很長的命令時候,如果都寫在一行昏兆,那太難看了也難以理解粉楚,因此就利用到了這個符號可以將一條完整的命令分成多行,舉個例子:

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# echo my \

> name\

> ``is \

> zcl

my nameis zcl

[root@chengliang zcl]``#

|

sed命令使用反斜線亮垫,首先輸入完“sed '2a 106,dandan,CSO \”,然后敲回車鍵模软,這樣窗口會顯示一個符號“>”,我們在這個符號后面接著寫命令的剩余部分“107,bingbing饮潦,CCO‘ person.txt”燃异。

|

1

2

3

4

5

6

7

8

9

10

|

[root@chengliang zcl]``# sed '2a 106,dandan,CSO \

> ``107``,bingibng,CCO' \

> zcl.txt

101``,chengliang,aa

102``,alex,bb

106``,dandan,CSO

107``,bingibng,CCO

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

sed軟件使用命令i插入多行文本和命令和a的用法是一樣的,因此這里不再詳細(xì)列出继蜡,大家可以練習(xí)一下

企業(yè)案例1:優(yōu)化SSH配置(一鍵完成增加若干參數(shù)

在我們學(xué)習(xí)CentOS6系統(tǒng)優(yōu)化時回俐,有一個優(yōu)化點(diǎn):更改ssh服務(wù)遠(yuǎn)程登錄的配置逛腿。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。

|

1

2

3

4

5

|

Port ``52113 #ssh服務(wù)端口

PermitRootLogin no ``#不允許root遠(yuǎn)程登陸

PermitEmptyPasswords no ``#不允許密碼為空

UseDNS no

GSSAPIAuthentication no

|

當(dāng)然我們可以使用vi/vim命令編輯這個文本仅颇,但是這樣就比較麻煩单默,現(xiàn)在想用一條命令增加5行文本到第13行前?

|

1

2

3

4

5

6

7

8

9

10

11

|

[root@chengliang ~]``# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令說明:題目要求在第``13``行前插入忘瓦,那就需要使用命令``13i``搁廓。有同學(xué)做個題目時,是這樣想的耕皮,在``13``行前境蜕,那不就是``12``行后嗎,``12a``也是可以的凌停。是的粱年,這樣也是沒錯的,這可以算是第二種方法罚拟。

最后插入的``5``行內(nèi)容使用“\n”就可以變成一行了台诗。

上面還有一個沒講過的選項(xiàng)``"-i"``,這個選項(xiàng)能夠?qū)嶋H的修改文件內(nèi)容,大家練習(xí)時可以去掉赐俗,防止改掉了配置文件拉队。如果使用了``-``i,可以用備份文件還原秃励。當(dāng)然氏仗,在生產(chǎn)環(huán)境修改配置文件那就需要用``-``i選項(xiàng)了。

[root@chensiqi1 ~]``# sed -n '13,17p' /etc/ssh/sshd_config

Port ``52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

|

刪除指定行文本

地址范圍 含義
10{sed-commands} 對第10行操作
10夺鲜,20{sed-commands} 對10到20行操作皆尔,包括第10,20行
10币励,+20{sed-commands} 對10到30(10+20)行操作慷蠕,包括第10,30行
1~2{sed-commands} 對1食呻,3流炕,5,7.....行操作
10仅胞,${sed-commands} 對10到最后一行($代表最后一行)操作每辟,包括第10行
/chensiqi/{sed-commands} 對匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 對匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,${sed-commands} 對匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 對匹配chensiqi的行到第10行操作,注意:如果前10行沒有匹配到chensiqi干旧,sed軟件會顯示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 對第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands} 對匹配chensiqi的行到其后的2行操作

如果在sed命令前面不指定地址范圍渠欺,那么默認(rèn)會匹配所有行,然后使用d命令刪除功能就會刪除這個文件的所有內(nèi)容

|

1

2

3

4

5

6

7

8

9

|

[root@chengliang zcl]``# cat test.txt

welcome to my blog:http:``/``/``www.cnblogs.com``/``0zcl

if you like my blog\'s contents,please support me!

bye! boys ``and girls.

[root@chengliang zcl]``# sed "d" test.txt

[root@chengliang zcl]``#

|

單行刪除想必大家能理解椎眯,指定刪除第2行的文本102,alex,bb

|

1

2

3

4

5

|

[root@chengliang zcl]``# sed "2d" zcl.txt

101``,chengliang,aa

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

"2挠将,3d" 指定刪除第2行到第3行的內(nèi)容胳岂,d代表刪除操作。

|

1

2

3

4

|

[root@chengliang zcl]``# sed "2,3d" zcl.txt

101``,chengliang,aa

104``,laonanhai,dd

[root@chengliang zcl]``#

|

正則匹配刪除

上面我們實(shí)驗(yàn)完了數(shù)字地址范圍舔稀,接下來我們實(shí)驗(yàn)一下正則表達(dá)式的地址范圍乳丰,雖然說可以使用正則表達(dá)式,但是我們還是習(xí)慣寫出完整的匹配字符串内贮,達(dá)到精確匹配的目的产园。

在sed軟件中,使用正則的格式和awk一樣贺归,使用2個”/“包含指定的正則表達(dá)式淆两,即“/正則表達(dá)式/”断箫。"/alex/d"有哪一行有alex則刪除這一行拂酣。

|

1

2

3

4

5

|

[root@chengliang zcl]``# sed "/alex/d" zcl.txt

101``,chengliang,aa

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

這是正則表達(dá)式形式的多行刪除,也是以逗號分隔2個地址仲义,最后結(jié)果是刪除包含“alex”的行到包含“eric”的行

|

1

2

3

4

|

[root@chengliang zcl]``# sed "/alex/,/eric/d" zcl.txt

101``,chengliang,aa

104``,laonanhai,dd

[root@chengliang zcl]``#

|

學(xué)過正則表達(dá)式后我們知道“”代表行尾婶熬,但是在sed中就有一些變化了,“”在sed中代表文件的最后一行埃撵。因此本例子的含義是刪除第2行到最后一行的文本赵颅,包含第2行和最后一行,因此只剩下第1行的內(nèi)容暂刘。

|

1

2

3

4

5

6

7

|

[root@chengliang zcl]``# sed "2,$d" zcl.txt

sed: ``-``e expression ``#1, char 2: unexpected,'`

[root@chengliang zcl]``# sed "2,\$d" zcl.txt

101``,chengliang,aa

[root@chengliang zcl]``# sed '2,$d' zcl.txt

101``,chengliang,aa

[root@chengliang zcl]``#

|

在工作中我們最常用的還是數(shù)字地址這種精確匹配方式饺谬,像上面的正則地址或混合地址這種模糊匹配用的比較少,了解即可谣拣。

具體可參考: http://www.cnblogs.com/chensiqiqi/p/6382080.html

特殊符號~(步長)解析

格式:“First~step”表示從開始募寨,以步長step遞增,這個在數(shù)學(xué)中叫做等差數(shù)列

例子:

  • 1~2 匹配1森缠,3拔鹰,5,7.....#-->用于只輸出奇書行贵涵,大伙仔細(xì)觀察一下每個數(shù)字的差值列肢。
  • 2~2 匹配2,4宾茂,6瓷马,8....#-->用于只輸出偶數(shù)行
  • 1~3 匹配1,4跨晴,7欧聘,10.....
  • 2~3 匹配2,5坟奥,8树瞭,11.....

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

|

[root@chengliang zcl]``# seq 10

1

2

3

4

5

6

7

8

9

10

[root@chengliang zcl]``# seq 10 | sed -n "1~2p"

1

3

5

7

9

[root@chengliang zcl]``#

|

命令說明:seq命令能夠生成從1到10的數(shù)字序列

命令說明:上面的命令主要驗(yàn)證特殊符號“~”的效果拇厢,其他sed命令用法n和p請見后文詳解,大家只需要知道這個命令可以將“1~2”指定的行顯示出來即可晒喷。

如果大家想生成奇數(shù)數(shù)列孝偎,其實(shí)上面的方法是為了舉例,并不是一個很好的方法凉敲,因?yàn)閟eq命令自帶這種功能衣盾。

|

1

2

3

4

5

6

7

|

[root@chengliang zcl]``# seq 1 2 10

1

3

5

7

9

[root@chengliang zcl]``#

|

命令說明:seq命令格式seq起始值 公差 結(jié)束值

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed "1~2d" zcl.txt

102``,alex,bb

104``,laonanhai,dd

[root@chengliang zcl]``# sed "1,+2d" zcl.txt

104``,laonanhai,dd

[root@chengliang zcl]``#

|

命令說明:“1~2”這是指定行數(shù)的另一種格式,從第1行開始以步長2遞增的行(1爷抓,3势决,5),因此刪掉第1蓝撇,3果复,5行,即所有的奇數(shù)行渤昌。

命令說明:這其實(shí)是做個加法運(yùn)算虽抄,‘1,+2d’==>刪除第1行到第3(1+2)行的文本独柑。

|

1

2

3

4

|

[root@chengliang zcl]``# sed '2,3!d' zcl.txt

102``,alex,bb

103``,eric,cc

[root@chengliang zcl]``#

|

命令說明:在地址范圍“2迈窟,3”后面加上“ !”忌栅,如果不加“车酣!”表示刪除第2行和第3行,結(jié)果如下面的例子所示索绪,然后加上“湖员!”的結(jié)果就是除了第2行和第3行以外的內(nèi)容都刪除,這個方法可以作為顯示文件的第2者春,3行題目的補(bǔ)充方法破衔。

按行替換,這個功能用的很少钱烟,所以大家了解即可晰筛。這里用到的sed命令是:
“c”:用新行取代舊行,記憶方法:c的全拼是change拴袭,意思是替換读第。

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed "2c wahaha" zcl.txt

101``,chengliang,aa

wahaha

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

命令說明:使用sed命令c將原來第2行 “102,alex,bb” 替換成 “wahaha” , 整行替換

文本替換

有工作經(jīng)驗(yàn)的同學(xué)應(yīng)該非常的熟悉,因?yàn)槭褂胹ed軟件80%的場景就是使用替換功能拥刻。

這里用到的sed命令怜瞒,選項(xiàng):(重要)

  • “s”:單獨(dú)使用-->將每一行中第一處匹配的字符串進(jìn)行替換==>sed命令
  • “g”:每一行進(jìn)行全部替換-->sed命令s的替換標(biāo)志之一(全局替換),非sed命令。
  • “-i”:修改文件內(nèi)容-->sed軟件的選項(xiàng)吴汪,注意和sed命令i區(qū)別刑然。

sed軟件替換模型 ===> sed -i 's#目標(biāo)內(nèi)容#替換內(nèi)容#g'

  • 定界符/或#煮盼,第一個和第二個之間的就是被替換的內(nèi)容前翎,第二個和第三個之間的就是替換后的內(nèi)容燃乍。建議大家使用#作為定界符。
  • s#目標(biāo)內(nèi)容#替換內(nèi)容#g 霜运,“目標(biāo)內(nèi)容”能用正則表達(dá)式脾歇,但替換內(nèi)容不能用,必須是具體的淘捡。因?yàn)樘鎿Q內(nèi)容使用正則的話會讓sed軟件無所適從藕各,它不知道你要替換什么內(nèi)容。
  • 默認(rèn)sed軟件是對模式空間(內(nèi)存中的數(shù)據(jù))操作焦除,而-i選項(xiàng)會更改磁盤上的文件內(nèi)容激况。

結(jié)果為第二行的“bb”替換為“i am bb”。

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed "s#bb#i am bb#g" zcl.txt

101``,chengliang,aa

102``,alex,i am bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

[root@chensiqi1 ~]# sed -i 's#zhangyang#dandan#g' person.txt

命令說明:如果想真正的修改文件內(nèi)容踢京,我們就需要使用選項(xiàng)“-i”誉碴。同時我們可以發(fā)現(xiàn)命令執(zhí)行后的結(jié)果是沒有任何輸出的宦棺。

企業(yè)案例2:指定行修改配置文件

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed "3s#0#9#" zcl.txt

101``,chengliang,aa

102``,alex,bb

193``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

命令說明: 前面學(xué)習(xí)的例子在sed命令“s”前沒有指定地址范圍瓣距,因此默認(rèn)是對所有行進(jìn)行操作。 而這個案例要求只將第3行的0換成9代咸,這里就用到了我們前面學(xué)過的地址范圍知識蹈丸,在sed命令“s”前加上“3”就代表對第3行進(jìn)行替換

變量替換

變量替換其實(shí)和前面的文本替換是一樣的,就是具體的文本變成了變量呐芥,同時要求大家對引號的用法要有清晰的理解.

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

|

[root@chengliang zcl]``# cat > person.txt<<KOF

> a

> b

> a

> KOF

[root@chengliang zcl]``# cat person.txt

a

b

a

[root@chengliang zcl]``# x=a

[root@chengliang zcl]``# y=b

[root@chengliang zcl]``# echo $x ##-->設(shè)置變量x并 賦值a

a

[root@chengliang zcl]``# echo $b

[root@chengliang zcl]``# echo $y

b

[root@chengliang zcl]``#

|

不使用引號

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

[root@chengliang zcl]``# sed s#$x#$y#g person.txt

b

b

b

[root@chengliang zcl]``# sed 's#'$x'#'$y'#g' person.txt

b

b

b

[root@chengliang zcl]``# sed 's#$x#$y#g' person.txt

a

b

a

[root@chengliang zcl]``#命令說明:表面看起來單引號是可以用的逻杖,但其實(shí)這里用了障眼法,在你們眼中分段‘$x’和'$y',但其實(shí)分段是‘s#’和‘#’和‘#g’,所以$x和$y并沒有被引號擴(kuò)起來思瘟,和上面的例子就一樣了荸百。

|

使用eval命令:

|

1

2

3

4

5

6

7

8

9

|

[root@chengliang zcl]``# sed 's#$x#$y#g' person.txt

a

b

a

[root@chengliang zcl]``# eval sed 's#$x#$y#g' person.txt

b

b

b

[root@chengliang zcl]``#

|

命令說明:這里給大家擴(kuò)展一個Linux內(nèi)置命令eval,這個命令能讀入變量滨攻,并將他們組合成一個新的命令够话,然后執(zhí)行。首先eval會解析變量x和變量y光绕,最后達(dá)到的效果和雙引號是一樣的

拓展: 最快速的獲取IP地址的方法

|

1

2

3

|

[root@chengliang zcl]``# hostname -I

192.168``.``179.133

[root@chengliang zcl]``#

|

分組替換()和\1的使用說明

sed軟件的()的功能可以記住正則表達(dá)式的一部分女嘲,其中,\1為第一個記住的模式即第一個小括號中的匹配內(nèi)容诞帐,\2第二個記住的模式,即第二個小括號中的匹配內(nèi)容停蕉,sed最多可以記住9個愕鼓。

例:echo "I am chensiqi teacher." 如果想保留這一行的單詞chengliang钙态,刪除剩下部分,使用圓括號標(biāo)記想保留的部分菇晃。

|

1

2

3

4

5

6

7

8

9

|

[root@chengliang zcl]``# echo "I am chengliang student." | sed 's#^.*am \([a-z]\+\) stu.*$#\1#g'

chengliang

[root@chengliang zcl]``# echo "I am chengliang student." | sed -r 's#^.*am ([a-z]+) stu.*$#\1#g'

chengliang

[root@chengliang zcl]``# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1#g'

am

[root@chengliang zcl]``# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1\2#g'

amchengliang

[root@chengliang zcl]``#

|

再來看個題目:請執(zhí)行命令取出linux中的eth0的IP地址驯绎?

|

1

2

3

4

5

6

7

8

9

10

11

12

|

[root@chensiqi1 ~]``# ifconfig eth0 | sed -n '2p'

inet addr:``192.168``.``197.133 Bcast:``192.168``.``197.255 Mask:``255.255``.``255.0

[root@chensiqi1 ~]``# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'

192.168``.``197.133

也可以進(jìn)行組合

[root@chensiqi1 ~]``# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'

192.168``.``197.133

命令說明:

這道題是需要把ifconfig eth0執(zhí)行結(jié)果的第``2``行的IP地址取出來,上面答案的思路是用IP地址來替換第``2``行的內(nèi)容谋旦。

|

特殊符號&代表被替換的內(nèi)容

這是一個特殊技巧剩失,在適合的場景使用特別方便。下面用特殊符號“&”與分組替換一起使用册着,進(jìn)行對比拴孤。

|

1

2

3

4

5

6

7

8

9

10

11

|

[root@chengliang zcl]``# cat zcl.txt

101``,chengliang,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed -r 's#(.*),(.*),(.*)#& ----- \1 \2 \3#' zcl.txt

101``,chengliang,aa ``-``-``-``-``- 101 chengliang aa

102``,alex,bb ``-``-``-``-``- 102 alex bb

103``,eric,cc ``-``-``-``-``- 103 eric cc

104``,laonanhai,dd ``-``-``-``-``- 104 laonanhai dd

[root@chengliang zcl]``#

|

上面命令的&符號代表每一行,即模型中‘s#目標(biāo)內(nèi)容#替換內(nèi)容#g’的目標(biāo)內(nèi)容甲捏。

企業(yè)案例3:批量重命名文件

當(dāng)前目錄下有文件如下所示:

|

1

2

3

4

5

6

7

|

[root@chengliang test_1]``# find ./ -name "*_finished.jpg"

.``/``stu_102999_4_finished.jpg

.``/``stu_102999_1_finished.jpg

.``/``stu_102999_5_finished.jpg

.``/``stu_102999_3_finished.jpg

.``/``stu_102999_2_finished.jpg

[root@chengliang test_1]``#

|

要求用sed命令重命名演熟,效果為:

|

1

2

|

stu_102999_1_finished.jpg``=``=``>stu_102999_1.jpg,即刪除文件名的_finished

mv ``- move (rename) files

|

解題思路:因?yàn)檫@是文件名,不能直接yongsed命令替換司顿,因此還需要借助mv命令重命名

格式為:mv stu_102999_1_finished.jpg stu_102999_1.jpg. 我們需要拼湊這樣的格式芒粹,然后使用bash命令執(zhí)行即可。

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

|

[root@chengliang test_1]``# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#\1\2#g'

.``/``stu_102999_4.jpg

.``/``stu_102999_1.jpg

.``/``stu_102999_5.jpg

.``/``stu_102999_3.jpg

.``/``stu_102999_2.jpg

[root@chengliang test_1]``# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g'

mv .``/``stu_102999_4_finished.jpg .``/``stu_102999_4.jpg

mv .``/``stu_102999_1_finished.jpg .``/``stu_102999_1.jpg

mv .``/``stu_102999_5_finished.jpg .``/``stu_102999_5.jpg

mv .``/``stu_102999_3_finished.jpg .``/``stu_102999_3.jpg

mv .``/``stu_102999_2_finished.jpg .``/``stu_102999_2.jpg

[root@chengliang test_1]``# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' | bash

[root@chengliang test_1]``# ls

stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg

[root@chengliang test_1]``#

|

命令說明:

  1. “\1”代表前面“(^.*)”匹配內(nèi)容大溜,“&”代表“s# #”里被替換的內(nèi)容化漆,這里匹配到的是完整的文件名。
  2. 使用bash命令執(zhí)行钦奋,bash命令執(zhí)行標(biāo)準(zhǔn)輸入的語句座云,如同我們在命令行輸入語句后敲回車。

我們想查看文件中的某些行付材,以前最常用的是cat或more或less命令等朦拖,但這些命令有些缺點(diǎn),就是不能查看指定的行厌衔。而我們用了很久的sed命令就有了這個功能了璧帝。而且我們前面也說過使用sed比其他命令vim等讀取速度更快!

“p”:輸出指定內(nèi)容富寿,但默認(rèn)會輸出2次匹配的結(jié)果睬隶,因此使用-n選項(xiàng)取消默認(rèn)輸出,記憶方法:p的全拼是print作喘,意思是打印理疙。

按行查詢

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

|

[root@chengliang zcl]``# sed "2p" zcl.txt

101``,chengliang,aa

102``,alex,bb

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed -n "2p" zcl.txt

102``,alex,bb

[root@chengliang zcl]``#

命令說明:選項(xiàng)``-``n取消默認(rèn)輸出,只輸出匹配的文本泞坦,大家只需要記住使用命令p必用選項(xiàng)``-``n窖贤。

[root@chengliang zcl]``# sed -n "2,3p" zcl.txt

102``,alex,bb

103``,eric,cc

[root@chengliang zcl]``#

命令說明:查看文件的第``2``行到``3``行,使用地址范圍“``2``,``3``”赃梧。取行就用sed滤蝠,最簡單

[root@chengliang zcl]``# sed -n "1~2p" zcl.txt

101``,chengliang,aa

103``,eric,cc

命令說明:打印文件的``1``,``3``授嘀,``5``行物咳。~代表步長

[root@chengliang zcl]``# sed -n "p" zcl.txt

101``,chengliang,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

命令說明:不指定地址范圍蹄皱,默認(rèn)打印全部內(nèi)容览闰。

|

按字符串查詢

|

1

2

3

4

5

6

7

8

9

10

11

|

[root@chengliang zcl]``# sed -n "/alex/p" zcl.txt ==>命令說明:打印含CTO的行

102``,alex,bb

[root@chengliang zcl]``#

[root@chengliang zcl]``# sed -n "/alex/,/chengliang/p" zcl.txt

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# sed -n "/alex/,/eric/p" zcl.txt ==>命令說明:打印含alex的行到含eric的行

102``,alex,bb

103``,eric,cc

[root@chengliang zcl]``#

|

混合查詢

|

1

2

3

4

5

6

7

8

9

|

[root@chengliang zcl]``# sed -n "2, /cc/p" zcl.txt

102``,alex,bb

103``,eric,cc

命令說明:打印第``2``行到含cc的行。

[root@chengliang zcl]``# sed -n "/cc/,2p" zcl.txt

103``,eric,cc

[root@chengliang zcl]``#

命令說明:特殊情況巷折,前兩行沒有匹配到cc压鉴,就向后匹配,如果匹配到cc就打印此行锻拘。所以這種混合地址不推薦使用油吭。

|

過濾多個字符

|

1

2

3

4

|

[root@chengliang zcl]``# sed -rn "/alex|cc/p" zcl.txt

102``,alex,bb

103``,eric,cc

[root@chengliang zcl]``#

|

命令說明: 使用擴(kuò)展正則“|”,為了不使用轉(zhuǎn)義符號“\”署拟,因此使用-r選項(xiàng)開啟擴(kuò)展正則表達(dá)式模式

sed修改文件的同時進(jìn)行備份

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

|

[root@chengliang zcl]``# ls

a a.bak ac ae ae.bak afff person.txt test.txt test_1 zcl.txt

[root@chengliang zcl]``# sed -i.bak "s#chengliang#Fuck#g" zcl.txt

[root@chengliang zcl]``# ls

a a.bak ac ae ae.bak afff person.txt test.txt test_1 zcl.txt zcl.txt.bak

[root@chengliang zcl]``# cat zcl.txt

101``,Fuck,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``# cat zcl.txt.bak

101``,chengliang,aa

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

命令行說明: 在-i參數(shù)的后邊加上.bak(.任意字符)婉宰,sed會對文件進(jìn)行先備份后修改

特殊符號=獲取行號

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

|

[root@chengliang zcl]``# sed '=' zcl.txt

1

101``,Fuck,aa

2

102``,alex,bb

3

103``,eric,cc

4

104``,laonanhai,dd

命令說明:使用特殊符號“``=``”就可以獲取文件的行號,這是特殊用法推穷,記住即可心包。從上面的命令結(jié)果我們也發(fā)現(xiàn)了一個不好的地方:行號和行不在一行。

[root@chengliang zcl]``# sed '1,3=' zcl.txt

1

101``,Fuck,aa

2

102``,alex,bb

3

103``,eric,cc

104``,laonanhai,dd

命令說明:只打印``1``缨恒,``2``谴咸,``3``行的行號,同時打印輸出文件中的內(nèi)容

[root@chengliang zcl]``#

[root@chengliang zcl]``# sed '/alex/=' zcl.txt

101``,Fuck,aa

2

102``,alex,bb

103``,eric,cc

104``,laonanhai,dd

命令說明:只打印正則匹配行的行號骗露,同時輸出文件中的內(nèi)容

[root@chengliang zcl]``# sed -n '/alex/=' zcl.txt

2

命令說明:只顯示行號但不顯示行的內(nèi)容即取消默認(rèn)輸出

[root@chengliang zcl]``# sed -n '$=' zcl.txt

4

[root@chengliang zcl]``#

命令說明:“$”代表最后一行,因此顯示最后一行的行號血巍,變相得出文件的總行數(shù)萧锉。

|

方法改進(jìn):

|

1

2

3

4

5

6

|

[root@chengliang zcl]``# sed '=' zcl.txt | sed 'N;s#\n# #'

1 101``,Fuck,aa

2 102``,alex,bb

3 103``,eric,cc

4 104``,laonanhai,dd

[root@chengliang zcl]``#

|

sed如何取不連續(xù)的行

|

1

2

3

4

5

|

[root@chengliang zcl]``# sed -n "1p;3p;4p" zcl.txt

101``,Fuck,aa

103``,eric,cc

104``,laonanhai,dd

[root@chengliang zcl]``#

|

特殊符號{}的使用

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

[root@chengliang zcl]``# sed -n '2,3p;=' zcl.txt

1

102``,alex,bb

2

103``,eric,cc

3

4

[root@chengliang zcl]``# sed -n '2,3{p;=}' zcl.txt

102``,alex,bb

2

103``,eric,cc

3

[root@chengliang zcl]``#

|

  • 命令說明:-n去掉默認(rèn)輸出,2,4p述寡,輸出2到4行內(nèi)容柿隙,=輸出全部的行的行號
  • 命令說明: ‘2,4{p;=}’代表統(tǒng)一輸出2鲫凶,4行的行號和內(nèi)容
    原文學(xué)習(xí)來自博客園禀崖,鏈接:https://www.cnblogs.com/0zcl/p/6855740.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市螟炫,隨后出現(xiàn)的幾起案子波附,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掸屡,死亡現(xiàn)場離奇詭異封寞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仅财,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門狈究,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盏求,你說我怎么就攤上這事抖锥。” “怎么了碎罚?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵宁改,是天一觀的道長。 經(jīng)常有香客問我魂莫,道長还蹲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任耙考,我火速辦了婚禮谜喊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倦始。我一直安慰自己斗遏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布鞋邑。 她就那樣靜靜地躺著诵次,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枚碗。 梳的紋絲不亂的頭發(fā)上逾一,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音肮雨,去河邊找鬼遵堵。 笑死,一個胖子當(dāng)著我的面吹牛怨规,可吹牛的內(nèi)容都是我干的陌宿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼波丰,長吁一口氣:“原來是場噩夢啊……” “哼壳坪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掰烟,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爽蝴,失蹤者是張志新(化名)和其女友劉穎沐批,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霜瘪,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珠插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颖对。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捻撑。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缤底,靈堂內(nèi)的尸體忽然破棺而出顾患,到底是詐尸還是另有隱情,我是刑警寧澤个唧,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布江解,位于F島的核電站,受9級特大地震影響徙歼,放射性物質(zhì)發(fā)生泄漏犁河。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一魄梯、第九天 我趴在偏房一處隱蔽的房頂上張望桨螺。 院中可真熱鬧,春花似錦酿秸、人聲如沸灭翔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肝箱。三九已至,卻和暖如春稀蟋,著一層夾襖步出監(jiān)牢的瞬間煌张,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工糊治, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唱矛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓井辜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親管闷。 傳聞我的和親對象是個殘疾皇子粥脚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 說明:本篇文章來自老男孩,這里只做備份記錄 功能說明 Sed是Stream Editor(流編輯器)縮寫包个,是操作刷允、...
    think_lonely閱讀 718評論 0 2
  • 行前或行后插入 sed 'p;s/^.*$/--------/' file awk '{print $0;prin...
    不排版閱讀 518評論 0 0
  • # sed -n '/Dec 28 15:15:00/,$p' filename //查詢某段時間到現(xiàn)在的日...
    ssdsss閱讀 887評論 0 0
  • 一冤留、涉及命令及知識分析 1.1解題思想探討 拿到一個題,或者接手一項(xiàng)任務(wù)树灶,我們首先應(yīng)該怎么做纤怒? PMP學(xué)習(xí)舉例,辦...
    溫東閱讀 3,363評論 2 4
  • 去年同事遷居天誠麗景小區(qū)天通,恰好碰上一位河南的新住戶泊窘,問話后得知他的來歷,原來曾是新疆哈密區(qū)公安局長像寒,兩年前退休后游...
    陵海一春閱讀 905評論 0 2