當(dāng)前位置:首頁 > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

linux文本處理三劍客之sed,原來只需要掌握這些?。?!
2021-09-28 16:51:54

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux

?前言:

shell腳本最常見的一個(gè)用途就是處理文本文件。檢查日志文件、讀取配置 文件、處理數(shù)據(jù)元素,shell腳本可以幫助我們將文本文件中各種數(shù)據(jù)的日常處理任務(wù)自動(dòng)化。但僅靠shell腳本命令來處理文本文件的內(nèi)容有點(diǎn)力不從心的。如果想在shell腳本中處理任何類型的數(shù)據(jù),掌握sed和gawk工具可以達(dá)到事半功倍的效果。企業(yè)開發(fā)中常用,高階命令。

一、sed編輯器基本了解

sed 編輯器被稱作 流編輯器 ( stream editor),和普通的交互式文本編輯器恰好相反。流編

輯器會(huì)在編輯器處理數(shù)據(jù)之前基于預(yù)先提供的一組規(guī)則來編輯數(shù)據(jù)流。 可以根據(jù)命令來處理數(shù)據(jù)流中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲(chǔ) 在一個(gè)命令文本文件中。

sed編輯器執(zhí)行流程大致如下:

  1. 一次從輸入中讀取一行數(shù)據(jù)。
  2. 根據(jù)所提供的編輯器命令匹配數(shù)據(jù)。
  3. 按照命令修改流中的數(shù)據(jù)。
  4. 將新的數(shù)據(jù)輸出到STDOUT。

核心講解:

在流編輯器將所有命令與一行數(shù)據(jù)匹配完畢后,它會(huì)讀取下一行數(shù)據(jù)并重復(fù)這個(gè)過程。在流

編輯器處理完流中的所有數(shù)據(jù)行后,它就會(huì)終止。

由于命令是按順序逐行給出的, sed 編輯器只需對(duì)數(shù)據(jù)流進(jìn)行一遍處理就可以完成編輯操作。

這使得 sed 編輯器要比交互式編輯器快得多,你可以快速完成對(duì)數(shù)據(jù)的自動(dòng)修改。

有了上面核心理論的了解,下面我們就可以對(duì)sed進(jìn)行實(shí)操演練了:

sed 使用的語法格式:

sed options script file

常用參數(shù)羅列:

  • -e script 在處理輸入時(shí),將script中指定的命令添加到已有的命令中
  • -f file 在處理輸入時(shí),將file中指定的命令添加到已有的命令中
  • -n 不產(chǎn)生命令輸出,使用print命令來完成輸出

重點(diǎn)說明:

script 參數(shù)指定了應(yīng)用于流數(shù)據(jù)上的單個(gè)命令。如果需要用多個(gè)命令,要么使用 -e 選項(xiàng)在

命令行中指定,要么使用 -f 選項(xiàng)在單獨(dú)的文件中指定。有大量的命令可用來處理數(shù)據(jù)。

1.1 在終端命令行使用單條sed命令

默認(rèn)情況下, sed 編輯器會(huì)將指定的命令應(yīng)用到 STDIN 輸入流上。這樣你可以直接將數(shù)據(jù)通

過管道輸入 sed 編輯器處理。

演示案例:

單行文本修改:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux_02

?如截圖中所見,這個(gè)例子在sed編輯器中使用了s命令。s命令會(huì)用斜線間指定的第二個(gè)文本字符串來替換第 一個(gè)文本字符串模式。在本例中是big test替換了test。

整個(gè)文本修改:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_大數(shù)據(jù)_03

?核心講解:

在運(yùn)行上面的例子時(shí),結(jié)果都是立即就會(huì)顯示出來的。這就是使用 sed編輯器的強(qiáng)大之處。我們可以同時(shí)對(duì)文本數(shù)據(jù)做出多處修改,而需要操作的時(shí)間是及其短暫的。需要注意的一點(diǎn)的是,sed編輯器并不會(huì)修改原來文本文件的數(shù)據(jù)。它只會(huì)將修改后的數(shù)據(jù)發(fā)送到STDOUT,我們可以查看源文本的數(shù)據(jù)依舊保持不變。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_運(yùn)維_04?1.2 在命令行使用多個(gè)sed 命令

要在 sed 命令行上執(zhí)行多個(gè)命令時(shí),只要用 -e 選項(xiàng)就可以了。

?操作演示:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_sed_05

?操作詳解:

兩個(gè)命令都作用到文件中的每行數(shù)據(jù)上。命令之間必須用分號(hào)隔開,并且在命令末尾和分號(hào) 之間不能有空格。還有一種方式我們使用的很少,就是用shell中的次提示符來分隔命令,如下截圖:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_運(yùn)維_06

?1.3?從文件中讀取編輯器命令

有時(shí)候我們有大量要處理的sed命令,此時(shí)我們就可以命令放在一個(gè)腳本文件里,文件通常以.sed 結(jié)尾,使用中我們只需要應(yīng)用 -f 參數(shù),就可以來讀取文件中命令:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_awk_07

核心解說:?

如上圖,sed編輯器知道每行都是一條單獨(dú)的命令。 跟在命令行輸入命令一樣,sed編輯器會(huì)從指定文件中讀取命令,并將它們應(yīng)用到數(shù)據(jù)文件中的 每一行上。同樣達(dá)到了對(duì)文本處理的效果。

二、sed編輯器工作中經(jīng)常的使用

成功使用 sed 編輯器的關(guān)鍵在于掌握其各式各樣的命令和格式,它們能夠幫助你定制文本編

輯行為。本節(jié)將介紹一些可以集成到腳本中基本命令和功能。上面章節(jié)我們已經(jīng)懂得了如何用s 命令( substitute )來在行中替換文本。這個(gè)命令還有另外一些選 項(xiàng)能讓事情變得更為簡(jiǎn)單。

2.1. 替換標(biāo)記


實(shí)例展示:


linux文本處理三劍客之sed,原來只需要掌握這些?。?!_sed_08


上圖中可以看到替換命令在替換多行中的文本時(shí)能正常工作,但默認(rèn)情況下它只替換每行中出現(xiàn)的第一處。 要讓替換命令能夠替換一行中不同地方出現(xiàn)的文本必須使用替換標(biāo)(substitutionflag),替換標(biāo)記會(huì)在替換命令字符串之后設(shè)置。

替換標(biāo)記分類:

  • 數(shù)字,表明新文本將替換第幾處模式匹配的地方;
  • g,表明新文本將會(huì)替換所有匹配的文本;
  • p,表明原先行的內(nèi)容要打印出來;
  • w file,將替換的結(jié)果寫到文件中。

在第一類替換中,可以指定 sed 編輯器用新文本替換第幾處模式匹配的地方。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_大數(shù)據(jù)_09

?linux文本處理三劍客之sed,原來只需要掌握這些?。?!_awk_10

?對(duì)比一以上兩圖,我們可以得出結(jié)論:

將替換標(biāo)記指定為 2 的結(jié)果就是: sed 編輯器只替換每行中第二次出現(xiàn)的匹配模式。 g替換標(biāo)

使你能替換文本中匹配模式所匹配的每處地方。?

p 替換標(biāo)記會(huì)打印與替換命令中指定的模式匹配的行。這通常會(huì)和 sed 的 -n 選項(xiàng)一起使用。

-n 選項(xiàng)將禁止 sed 編輯器輸出。但 p 替換標(biāo)記會(huì)輸出修改過的行。將二者配合使用的效果就是

只輸出被替換命令修改過的行。

如下效果圖:

linux文本處理三劍客之sed,原來只需要掌握這些!??!_awk_11

w 替換標(biāo)記會(huì)產(chǎn)生和p替換標(biāo)記相同的輸出,不同的是w會(huì)將輸出保存到指定文件中。

如下效果圖:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_awk_12

?2.2 替換字符

有時(shí)我們會(huì)在文本字符串中遇到一些不太方便在替換模式中使用的字符。 Linux 中一個(gè)常見的

例子就是正斜線( / )。 替換文件中的路徑名會(huì)比較麻煩。

比如下面,如果想用C shell替換/etc/passwd文件中的bash shell,需要使用如下方式: linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux_13

?上面我們可以發(fā)現(xiàn),由于正斜線通常用作字符串分隔符,因而如果它出現(xiàn)在了模式文本中的話,必須用反斜線來 轉(zhuǎn)義。這通常會(huì)帶來一些困惑和錯(cuò)誤。 要解決這個(gè)問題,sed編輯器允許選擇其他字符來作為替換命令中的字符串分隔符,下例中我們就是使用感嘆號(hào)用作字符串分隔符。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_運(yùn)維_14

?2.3 sed 的尋址操作

sed 的尋址模式分為兩種:

  1. 以數(shù)字形式表示行區(qū)間
  2. 用文本模式來過濾出行

兩種尋址的語法格式是相同的,sed編輯器會(huì)將指定的每條命令作用到匹配指定地址的行上。

[address]command

或者是將特定地址的多個(gè)命令分組:

address {

command1

command2

command3

}

2.3.1 數(shù)字尋址(常用的方式)



????????當(dāng)使用數(shù)字方式的行尋址時(shí),可以用行在文本流中的行位置來引用。sed 編輯器會(huì)將文本流中的第一行編號(hào)為1 ,然后繼續(xù)按順序?yàn)榻酉聛淼男蟹峙湫刑?hào)。 在命令中指定的地址可以是單個(gè)號(hào),或是用起始行號(hào)、逗號(hào)以及結(jié)尾行號(hào)指定的一定區(qū)間范圍內(nèi)的行。


演示截圖:


a.指定行號(hào)


linux文本處理三劍客之sed,原來只需要掌握這些?。。awk_15


b.行地址區(qū)間linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux_16

?c.如果想將命令作用到文本中從某行開始的所有行,可以用特殊地址$.

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux_17

?2.3.2?使用文本模式過濾器(不常用)


sed 編輯器允許指定文本模式來過 濾出命令要作用的行。


格式如下:


/pattern/ command

必須用正斜線將要指定的pattern封起來。sed編輯器會(huì)將該命令作用到包含指定文本模式的行上。?

如下面給的示例:修改用戶Samantha的默認(rèn)shell,可以使用sed命令。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_linux_18?核心詳解:

該命令只作用到匹配文本模式的行上。雖然使用固定文本模式能幫你過濾出特定的值,就跟 上面這個(gè)用戶名的例子一樣,但其作用難免有限。sed 編輯器在文本模式中采用了一種稱為 正則 表達(dá)式( regular expression )的特性來幫助你創(chuàng)建匹配效果更好的模式。

?2.3.3 命令組合使用

如果需要在單行上執(zhí)行多條命令,可以用花括號(hào)將多條命令組合在一起。 sed 編輯器會(huì)處理

地址行處列出的每條命令。



linux文本處理三劍客之sed,原來只需要掌握這些?。?!_sed_19


兩條命令都會(huì)作用到該地址上。同樣,也可以在一組命令前指定一個(gè)地址區(qū)間。?

linux文本處理三劍客之sed,原來只需要掌握這些!??!_運(yùn)維_20

2.4 刪除行?

文本替換命令不是 sed 編輯器唯一的命令。如果需要?jiǎng)h除文本流中的特定行,可以用刪除命令。

刪除命令d名副其實(shí),它會(huì)刪除匹配指定尋址模式的所有行。使用該命令時(shí)要特別小心,如 果你忘記加入尋址模式的話,流中的所有文本行都會(huì)被刪除。

linux文本處理三劍客之sed,原來只需要掌握這些?。。運(yùn)維_21

2.4.1 指定地址刪除

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_大數(shù)據(jù)_22?2.4.2 指定特定區(qū)間

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_sed_23

?2.4.3?通過特殊的文件結(jié)尾字符

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_運(yùn)維_24

?筆記重點(diǎn):

記住,sed編輯器不會(huì)修改原始文件。你刪除的行只是從sed編輯器的輸出中消失了。原始

文件仍然包含那些“刪掉的”行。

2.5??插入和附加文本

和其他編輯器類似,sed編輯器允許向數(shù)據(jù)流插入和附加文本行。兩個(gè)操作的區(qū)別可能比較讓人費(fèi)解:

  • 插入(insert)命令(i)會(huì)在指定行前增加一個(gè)新行;
  • 附加(append)命令(a)會(huì)在指定行后增加一個(gè)新行。

這兩條命令的費(fèi)解之處在于它們的格式。它們不能在單個(gè)命令行上使用。你必須指定是要將行插入還是附加到另一行。格式如下:

sed '[address]command ?new line'

注意:new line 中的文本將會(huì)出現(xiàn)在 sed 編輯器輸出中你指定的位置。記住,當(dāng)使用插入命令時(shí), 文本會(huì)出現(xiàn)在數(shù)據(jù)流文本的前面。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_sed_25

?2.5.1 指定行數(shù)插入數(shù)據(jù)

linux文本處理三劍客之sed,原來只需要掌握這些?。。運(yùn)維_26

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_大數(shù)據(jù)_27

2.6 修改行?

修改( change )命令允許修改數(shù)據(jù)流中整行文本的內(nèi)容。它跟插入和附加命令的工作機(jī)制

一樣,你必須在 sed 命令中單獨(dú)指定新行。

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_大數(shù)據(jù)_28

?2.7?轉(zhuǎn)換命令

轉(zhuǎn)換( transform )命令( y )是唯一可以處理單個(gè)字符的 sed 編輯器命令。轉(zhuǎn)換命令格式

如下:

[ address ] y / inchars / outchars /

轉(zhuǎn)換命令會(huì)對(duì) inchars 和 outchars 值進(jìn)行一對(duì)一的映射。 inchars 中的第一個(gè)字符會(huì)被轉(zhuǎn) 換outchars 中的第一個(gè)字符,第二個(gè)字符會(huì)被轉(zhuǎn)換成 outchars 中的第二個(gè)字符。這個(gè)映射過程會(huì)一直持續(xù)到處理完指定字符。如果inchars 和 outchars 的長(zhǎng)度不同,則 sed 編輯器會(huì)產(chǎn)生一 條錯(cuò)誤消息。

操作示例:

linux文本處理三劍客之sed,原來只需要掌握這些!?。linux_29

?如圖中輸出中看到的,inchars模式中指定字符的每個(gè)實(shí)例都會(huì)被替換成outchars模式中 相同位置的那個(gè)字符。 轉(zhuǎn)換命令是一個(gè)全局命令,也就是說,它會(huì)文本行中找到的所有指定字符自動(dòng)進(jìn)行轉(zhuǎn)換,而不會(huì)考慮它們出現(xiàn)的位置。

sed 編輯器轉(zhuǎn)換了在文本行中匹配到的字符 1 的兩個(gè)實(shí)例。無法限定只轉(zhuǎn)換在特定地方出現(xiàn) 的字符。

如下例:

linux文本處理三劍客之sed,原來只需要掌握這些?。?!_運(yùn)維_30

2.8?使用 sed 處理文件

替換命令包含一些可以用于文件的標(biāo)記。還有一些 sed 編輯器命令也可以實(shí)現(xiàn)同樣的目標(biāo),

不需要非得替換文本。

2.8.1 寫入文件

w 命令用來向文件寫入行。該命令的格式如下:

[ address ]w filename

filename 可以使用相對(duì)路徑或絕對(duì)路徑,但不管是哪種,運(yùn)行 sed 編輯器的用戶都必須有文

件的寫權(quán)限。地址可以是 sed 中支持的任意類型的尋址方式,例如單個(gè)行號(hào)、文本模式、行區(qū)間

或文本模式。

下面的例子是將數(shù)據(jù)流中的前兩行打印到一個(gè)文本文件中:

linux文本處理三劍客之sed,原來只需要掌握這些!??!_sed_31

?2.8.2?2. 從文件讀取數(shù)據(jù)

上面已經(jīng)了解了如何在 sed 命令行上向數(shù)據(jù)流中插入或附加文本。讀取( read )命令( r )允

許你將一個(gè)獨(dú)立文件中的數(shù)據(jù)插入到數(shù)據(jù)流中。

讀取命令的格式如下:

[ address ]r filename

filename 參數(shù)指定了數(shù)據(jù)文件的絕對(duì)路徑或相對(duì)路徑。你在讀取命令中使用地址區(qū)間,只

能指定單獨(dú)一個(gè)行號(hào)或文本模式地址。 sed 編輯器會(huì)將文件中的文本插入到指定地址后。

linux文本處理三劍客之sed,原來只需要掌握這些!??!_運(yùn)維_32

?后記:

雖然 shell 腳本本身完成很多事情,但單憑 shell 腳本通常很難處理數(shù)據(jù)。 Linux 提供了兩個(gè)方便

的工具來幫助處理文本數(shù)據(jù)。作為一款流編輯器, sed 編輯器能在讀取數(shù)據(jù)時(shí)快速地自動(dòng)處理數(shù) 據(jù)。必須給sed 編輯器提供用于處理數(shù)據(jù)的編輯命令。

下篇我們將會(huì)持續(xù)講到awk。。。。


?

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >