什么是sed?
sed 由傳奇的計(jì)算先驅(qū) Lee E. McMahon 于 1971 年在貝爾實(shí)驗(yàn)室開(kāi)發(fā)。該名稱代表“流編輯器”。sed 允許您通過(guò)一種緊湊而簡(jiǎn)單但圖靈完備的編程語(yǔ)言以編程方式編輯正文或文本流。sed 的工作方式很簡(jiǎn)單:它將文本逐行讀取到緩沖區(qū)中。對(duì)于每一行,它將在適用的情況下執(zhí)行預(yù)定義的指令。例如,如果有人要編寫一個(gè) sed 腳本,將單詞“beer”替換為“soda”,然后傳入一個(gè)包含“99 Bottles of Beer on the Wall”完整歌詞的文本文件,它將通過(guò)逐行打印該文件,并打印出“99 Bottles of Soda on the Wall”,依此類推。最基本的 sed 腳本是“Hello World”。在這里,我們使用僅輸出字符串的 echo 命令來(lái)打印“Hello World”。但是我們將它傳遞給 sed,并告訴它用“LinuxMi.com”替換“World”。一目了然。
linuxmi@linuxmi:~/www.linuxmi.com$ echo "Hello World" | sed s/World/LinuxMi.com/

s/I/Greg/
s/Me/Greg/
s/me/Greg/
s/My/Greg/
s/my/Greg/
您可能會(huì)注意到上面示例中的重復(fù)(例如 s/me/Greg/ 和 s/Me/Greg/)。這是因?yàn)?sed 的某些版本,例如 macOS 附帶的版本,不支持不區(qū)分大小寫的匹配。因此,我們必須為每個(gè)單詞編寫兩條指令,以便 sed 識(shí)別大寫和非大寫版本。這不會(huì)完美地工作,就好像您已經(jīng)手動(dòng)替換了“I”、“Me”和“My”的每個(gè)實(shí)例。請(qǐng)記住,我們只是將其用作練習(xí)來(lái)演示如何將 sed 指令組合到一個(gè)腳本中,然后使用單個(gè)命令執(zhí)行它們。然后,我們需要調(diào)用該文件。為此,請(qǐng)運(yùn)行此命令。
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed -f linuxmi.sed
讓我們看看這是怎么做的。你可能已經(jīng)注意到我們這里沒(méi)有使用 echo。我們使用 cat。這是因?yàn)?cat 會(huì)打印文件的全部?jī)?nèi)容,而 echo 只會(huì)打印文件名。您可能還注意到,我們使用“-f”標(biāo)志運(yùn)行 sed。這告訴它將腳本作為文件打開(kāi)。
最終結(jié)果是這樣的:
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed /^Take/d

什么是 AWK?
AWK 與 sed 一樣,是一種處理大量文本的編程語(yǔ)言。但是,雖然人們使用 sed 來(lái)處理和修改文本,但人們大多使用 AWK 作為分析和報(bào)告的工具。與 sed 一樣,AWK 最初是在 1970 年代在貝爾實(shí)驗(yàn)室開(kāi)發(fā)的。它的名字并非來(lái)自程序所做的事情,而是來(lái)自每個(gè)作者的姓氏:Alfred Aho、Peter Weinberger 和 Brian Kernighan??偠灾?,AWK 指的是編程語(yǔ)言本身。在小寫中,awk 指的是命令行工具。AWK 通過(guò)一次讀取一行文本文件或輸入流來(lái)工作。掃描每一行以查看它是否與預(yù)定義的模式匹配。如果找到匹配項(xiàng),則執(zhí)行操作。但是雖然 sed 和 AWK 可能有相似的目的,但它們是兩種完全不同的語(yǔ)言,具有兩種完全不同的設(shè)計(jì)理念。AWK 更類似于一些通用語(yǔ)言,如 C、Python 和 Bash。它具有諸如函數(shù)之類的東西以及更類似于 C 的方法來(lái)處理諸如迭代和變量之類的東西。簡(jiǎn)而言之,AWK 感覺(jué)更像是一種編程語(yǔ)言。所以,讓我們嘗試一下。使用“Take On Me”的歌詞,我們將打印所有超過(guò) 20 個(gè)字符的行。
linuxmi@linuxmi:~/www.linuxmi.com$ awk ' length($0) > 20 ' linuxmi.com.txt

結(jié)合兩者
awk 和 sed 結(jié)合起來(lái)都非常強(qiáng)大。您可以通過(guò)使用 Unix 管道來(lái)做到這一點(diǎn)。讓我們?cè)囋囘@個(gè):我們將使用 awk 列出“Take On Me”中超過(guò) 20 個(gè)字符的所有行。然后,我們將刪除所有以“Take”開(kāi)頭的行??傊?,這一切看起來(lái)像這樣:linuxmi@linuxmi:~/www.linuxmi.com$ awk 'length($0)>20' linuxmi.com.txt | sed /^Take/d
輸出如下:
sed 和 awk 的力量
在這篇文章中我們就解釋這么多,但希望您現(xiàn)在對(duì) sed 和 awk 的強(qiáng)大功能有所了解。簡(jiǎn)而言之,它們是一個(gè)文本處理引擎。那么,你為什么要關(guān)心呢?除了您永遠(yuǎn)不知道何時(shí)需要對(duì)文本文檔進(jìn)行可預(yù)測(cè)的重復(fù)更改這一事實(shí)之外,sed 和 awk 非常適合解析日志文件。當(dāng)您嘗試調(diào)試 LAMP 服務(wù)器中的問(wèn)題或查看訪問(wèn)日志以查看您的服務(wù)器是否被黑客入侵時(shí),這特別方便。
審核編輯 :李倩
-
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213715 -
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1956瀏覽量
36628 -
SED
+關(guān)注
關(guān)注
0文章
26瀏覽量
27332
原文標(biāo)題:為什么說(shuō)每個(gè) Linux 極客都需要了解 Sed 和 Awk
文章出處:【微信號(hào):Linux迷,微信公眾號(hào):Linux迷】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
??sed命令從入門到實(shí)戰(zhàn)
AWK6943ABTER:車規(guī)級(jí)高可靠電源解決方案

AWK6943:MP9943 的高效兼容替代方案及技術(shù)優(yōu)勢(shì)
Linux中文本處理命令的用法

步進(jìn)電機(jī)選型時(shí)必須要了解什么?
AWK工具介紹

Linux三劍客之Sed:文本處理神器

飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡(jiǎn)介
如何掌握Linux文本處理
二極管橋式整流電路需要什么二極管
linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核
USB 3.2雙通道操作:您需要了解的內(nèi)容

不只是前端,后端、產(chǎn)品和測(cè)試也需要了解的瀏覽器知識(shí)(二)

評(píng)論