sed 和 awk 是每個 Linux 高級用戶最喜歡的工具。但它們是什么?以及如何使用它們來處理文本文件?兩個最被低估的 Linux 實用程序是 sed 和 awk。盡管它們看起來有點神秘,但如果您必須對大段代碼或文本進行重復(fù)更改,或者如果您必須分析某些文本,sed 和 awk 是極為有用的。那么,它們是什么?它們是如何使用的?以及,當(dāng)它們組合在一起時,它們?nèi)绾问固幚砦谋咀兊酶菀祝?/span>
如果您需要進行一些更復(fù)雜的編輯,您還可以將 sed 指令組合到文件中。讓我們將 A-ha 的“ Take On Me ”的歌詞替換為Greg的“I”、“Me”和“My”的每個實例。首先,將歌曲的歌詞放入名為linuxmi.com.txt的文本文件中。然后打開您喜歡的文本編輯器,并添加以下行。確保您創(chuàng)建的文件以.sed結(jié)尾。
還值得注意的是 sed 支持正則表達式 (REGEX)。這些允許您使用特殊而復(fù)雜的語法在文本中定義模式。這是一個如何工作的示例。我們將采用上述歌詞,但使用正則表達式打印出每行不以“Take”開頭的行。
當(dāng)然,sed 非常有用。而且與 awk 結(jié)合使用時會更加強大。

什么是sed?
sed 由傳奇的計算先驅(qū) Lee E. McMahon 于 1971 年在貝爾實驗室開發(fā)。該名稱代表“流編輯器”。sed 允許您通過一種緊湊而簡單但圖靈完備的編程語言以編程方式編輯正文或文本流。sed 的工作方式很簡單:它將文本逐行讀取到緩沖區(qū)中。對于每一行,它將在適用的情況下執(zhí)行預(yù)定義的指令。例如,如果有人要編寫一個 sed 腳本,將單詞“beer”替換為“soda”,然后傳入一個包含“99 Bottles of Beer on the Wall”完整歌詞的文本文件,它將通過逐行打印該文件,并打印出“99 Bottles of Soda on the Wall”,依此類推。最基本的 sed 腳本是“Hello World”。在這里,我們使用僅輸出字符串的 echo 命令來打印“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/
您可能會注意到上面示例中的重復(fù)(例如 s/me/Greg/ 和 s/Me/Greg/)。這是因為 sed 的某些版本,例如 macOS 附帶的版本,不支持不區(qū)分大小寫的匹配。因此,我們必須為每個單詞編寫兩條指令,以便 sed 識別大寫和非大寫版本。這不會完美地工作,就好像您已經(jīng)手動替換了“I”、“Me”和“My”的每個實例。請記住,我們只是將其用作練習(xí)來演示如何將 sed 指令組合到一個腳本中,然后使用單個命令執(zhí)行它們。然后,我們需要調(diào)用該文件。為此,請運行此命令。
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed -f linuxmi.sed
讓我們看看這是怎么做的。你可能已經(jīng)注意到我們這里沒有使用 echo。我們使用 cat。這是因為 cat 會打印文件的全部內(nèi)容,而 echo 只會打印文件名。您可能還注意到,我們使用“-f”標(biāo)志運行 sed。這告訴它將腳本作為文件打開。
最終結(jié)果是這樣的:
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed /^Take/d

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

結(jié)合兩者
awk 和 sed 結(jié)合起來都非常強大。您可以通過使用 Unix 管道來做到這一點。讓我們試試這個:我們將使用 awk 列出“Take On Me”中超過 20 個字符的所有行。然后,我們將刪除所有以“Take”開頭的行??傊?,這一切看起來像這樣:linuxmi@linuxmi:~/www.linuxmi.com$ awk 'length($0)>20' linuxmi.com.txt | sed /^Take/d
輸出如下:
sed 和 awk 的力量
在這篇文章中我們就解釋這么多,但希望您現(xiàn)在對 sed 和 awk 的強大功能有所了解。簡而言之,它們是一個文本處理引擎。那么,你為什么要關(guān)心呢?除了您永遠不知道何時需要對文本文檔進行可預(yù)測的重復(fù)更改這一事實之外,sed 和 awk 非常適合解析日志文件。當(dāng)您嘗試調(diào)試 LAMP 服務(wù)器中的問題或查看訪問日志以查看您的服務(wù)器是否被黑客入侵時,這特別方便。
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Linux
+關(guān)注
關(guān)注
88文章
11576瀏覽量
216618 -
編程語言
+關(guān)注
關(guān)注
10文章
1957瀏覽量
38363 -
SED
+關(guān)注
關(guān)注
0文章
26瀏覽量
27469
原文標(biāo)題:為什么說每個 Linux 極客都需要了解 Sed 和 Awk
文章出處:【微信號:Linux迷,微信公眾號:Linux迷】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
linux系統(tǒng)awk特殊字符命令詳解
在Linux系統(tǒng)中,awk?是一種非常強大的文本處理工具,能夠?qū)ξ谋緮?shù)據(jù)進行分析、格式化和篩選。利用其內(nèi)置的特殊字符和操作符,用戶可以實現(xiàn)復(fù)雜的數(shù)據(jù)處理任務(wù)。以下對一些常見的awk特殊字符和操作符
Linux權(quán)限體系解析
你真的了解Linux權(quán)限嗎?大多數(shù)人只知道rwx,但Linux的權(quán)限體系遠比你想象的復(fù)雜和強大。今天我們深入探討Linux的12位權(quán)限體系,這是每個
??sed命令從入門到實戰(zhàn)
sed是一種流編輯器,能高效地完成各種替換、刪除、插入等操作,按照文件數(shù)據(jù)行順序,重復(fù)處理滿足條件的每一行數(shù)據(jù),然后把結(jié)果展示打印,且不會改變原文件內(nèi)容。
AWK6943ABTER:車規(guī)級高可靠電源解決方案
?AWK6943ABTER以車規(guī)級可靠性+極簡設(shè)計成為工業(yè)/汽車電源首選,其寬壓輸入、納米級響應(yīng)及打嗝式保護技術(shù),為高可靠系統(tǒng)提供國產(chǎn)化高性能替代方案。

AWK6943:MP9943 的高效兼容替代方案及技術(shù)優(yōu)勢
AWK6943 對 MP9943 的替換不僅是引腳與功能的簡單兼容,更是性能與可靠性的全面升級。更低的功耗、更高的效率、汽車級認證及靈活的配置特性,使其在消費電子、工業(yè)控制、車載系統(tǒng)等場景中更具優(yōu)勢。對于需要優(yōu)化續(xù)航、提升穩(wěn)定性或拓展應(yīng)用場景的設(shè)計,
AWK6943:MP9943?國產(chǎn)DCDC兼容替代方案及技術(shù)優(yōu)勢
高效兼容替換方案:AWK6943全面替代MP9943的技術(shù)解析在電源管理芯片領(lǐng)域,兼容替換方案的核心在于引腳定義、電氣參數(shù)與功能特性的高度匹配。AWK6943作為一款高性能同步降壓穩(wěn)壓器,憑借

步進電機選型時必須要了解什么?
步進電機選型時,必須要了解以下幾個方面的信息以確保所選電機能夠滿足特定的應(yīng)用需求: 1. 轉(zhuǎn)矩需求: ? ?● 步進電機的保持轉(zhuǎn)矩類似于傳統(tǒng)電機的“功率”,但物理結(jié)構(gòu)和輸出特性有所不同
芯享程半導(dǎo)體發(fā)布AWK6809高性能車規(guī)級DC-DC芯片
近日,上海芯享程半導(dǎo)體有限公司正式推出了其最新研發(fā)成果——AWK6809高性能車規(guī)級同步降壓型芯片。這款芯片以其出色的性能、低功耗以及卓越的EMI特性,在工業(yè)和汽車市場引起了廣泛關(guān)注
AWK工具介紹
awk是什么 awk是一個強大的linux命令,有強大的文本格式化的能力,好比將一些文本數(shù)據(jù)格式化成專業(yè)的excel表的樣式。 awk早期在Unix上實現(xiàn),我們用的

Linux三劍客之Sed:文本處理神器
關(guān)于linux三劍客 grep,過濾關(guān)鍵字信息數(shù)據(jù)。主要是用于查文本內(nèi)的數(shù)據(jù) sed ,對文本數(shù)據(jù)進行編輯,修改原文件內(nèi)容 awk,對文件數(shù)據(jù)過濾,提取,并且能實現(xiàn),格式化輸出 awk

嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介
學(xué)到本章節(jié),大家應(yīng)該對Linux操作系統(tǒng)都有了一定的了解,但可能還不知道我們拿到手的內(nèi)核源碼都經(jīng)歷了什么。linux有一個龐大的開源社區(qū),每個人都可以向開源社區(qū)提交代碼。由于
發(fā)表于 12-16 13:08
飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介
學(xué)到本章節(jié),大家應(yīng)該對Linux操作系統(tǒng)都有了一定的了解,但可能還不知道我們拿到手的內(nèi)核源碼都經(jīng)歷了什么。linux有一個龐大的開源社區(qū),每個人都可以向開源社區(qū)提交代碼。由于
發(fā)表于 12-13 09:03
如何掌握Linux文本處理
目錄 sed用法 模式空間與保持空間 sed命令選項 sed命令的基本語法 sed命令選項 基礎(chǔ)sed命令 高階
評論