區(qū)別:1、sed是流編輯器,而awk是文本格式化工具,報告生成器;2、awk適合對文件進行抽取整理,sed適合對文件進行編輯;3、sed讀取一行數(shù)據(jù),會以行作為單位進行處理,而awk讀取一行,會切割成字段,以字段(列)為單位,進行細(xì)節(jié)處理。
本教程操作環(huán)境:CentOS 6系統(tǒng)、Dell G3電腦。
awk
awk是一種程序語言,對文檔資料的處理具有很強的功能。awk擅長從格式化報文或從一個大的文本文件中抽取數(shù)據(jù)。
awk 命令是逐行掃描文件(從第 1 行到最后一行),尋找含有目標(biāo)文本的行,如果匹配成功,則會在該行上執(zhí)行用戶想要的操作;反之,則不對行做任何處理。
awk 命令的基本格式為:
awk?[選項]?'腳本命令'?文件名
此命令常用的選項以及各自的含義,如表 1 所示。
? ? ? ? ? ? ? ? 選項 | ? ? ? ? ? ? ? ? 含義 |
---|---|
? ? ? ? ? ? ? ? -F fs | ? ? ? ? ? ? ? ? 指定以 fs 作為輸入行的分隔符,awk 命令默認(rèn)分隔符為空格或制表符。 |
? ? ? ? ? ? ? ? -f file | ? ? ? ? ? ? ? ? 從腳本文件中讀取 awk 腳本指令,以取代直接在命令行中輸入指令。 |
? ? ? ? ? ? ? ? -v var=val | ? ? ? ? ? ? ? ? 在執(zhí)行處理過程之前,設(shè)置一個變量 var,并給其設(shè)備初始值為 val。 |
awk 的強大之處在于腳本命令,它由 2 部分組成,分別為匹配規(guī)則和執(zhí)行命令,如下所示:
'匹配規(guī)則{執(zhí)行命令}'
這里的匹配規(guī)則,和 sed 命令中的 address 部分作用相同,用來指定腳本命令可以作用到文本內(nèi)容中的具體行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正則表達(dá)式指定。另外需要注意的是,整個腳本命令是用單引號(”)括起,而其中的執(zhí)行命令部分需要用大括號({})括起來。
在 awk 程序執(zhí)行時,如果沒有指定執(zhí)行命令,則默認(rèn)會把匹配的行輸出;如果不指定匹配規(guī)則,則默認(rèn)匹配文本中所有的行。
舉個簡單的例子:
[root@localhost?~]#?awk?'/^$/?{print?"Blank?line"}'?test.txt
在此命令中,/^$/ 是一個正則表達(dá)式,功能是匹配文本中的空白行,同時可以看到,執(zhí)行命令使用的是 print 命令,此命令經(jīng)常會使用,它的作用很簡單,就是將指定的文本進行輸出。因此,整個命令的功能是,如果 test.txt 有 N 個空白行,那么執(zhí)行此命令會輸出 N 個 Blank line。
sed
sed 命令采用的是流編輯模式,最明顯的特點是,在 sed 處理數(shù)據(jù)之前,需要預(yù)先提供一組規(guī)則,sed 會按照此規(guī)則來編輯數(shù)據(jù)。
sed 會根據(jù)腳本命令來處理文本文件中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲在一個文本文件中,此命令執(zhí)行數(shù)據(jù)的順序如下:
-
每次僅讀取一行內(nèi)容;
-
根據(jù)提供的規(guī)則命令匹配并修改數(shù)據(jù)。注意,sed 默認(rèn)不會直接修改源文件數(shù)據(jù),而是會將數(shù)據(jù)復(fù)制到緩沖區(qū)中,修改也僅限于緩沖區(qū)中的數(shù)據(jù);
-
將執(zhí)行結(jié)果輸出。
當(dāng)一行數(shù)據(jù)匹配完成后,它會繼續(xù)讀取下一行數(shù)據(jù),并重復(fù)這個過程,直到將文件中所有數(shù)據(jù)處理完畢。
sed 命令的基本格式如下:
sed?[選項]?[腳本命令]?文件名
該命令常用的選項及含義,如表 1 所示。
? ? ? ? ? ? ? ? 選項 | ? ? ? ? ? ? ? ? 含義 |
---|---|
? ? ? ? ? ? ? ? -e 腳本命令 | ? ? ? ? ? ? ? ? 該選項會將其后跟的腳本命令添加到已有的命令中。 |
? ? ? ? ? ? ? ? -f 腳本命令文件 | ? ? ? ? ? ? ? ? 該選項會將其后文件中的腳本命令添加到已有的命令中。 |
? ? ? ? ? ? ? ? -n | ? ? ? ? ? ? ? ? 默認(rèn)情況下,sed 會在所有的腳本指定執(zhí)行完畢后,會自動輸出處理后的內(nèi)容,而該選項會屏蔽啟動輸出,需使用 print 命令來完成輸出。 |
? ? ? ? ? ? ? ? -i | ? ? ? ? ? ? ? ? 此選項會直接修改源文件,要慎用。 |
成功使用 sed 命令的關(guān)鍵在于掌握各式各樣的腳本命令及格式,它能幫你定制編輯文件的規(guī)則。
sed和awk的區(qū)別
-
sed是流編輯器,而awk是文本格式化工具,報告生成器
如果文件是格式化的,即由分隔符分為多個域的,優(yōu)先使用awk
-
awk適合對文件的抽取整理,sed適合對文件的編輯。
-
awk適合按列(域)操作,sed適合按行操作
sed:每次讀入一行來處理的,sed 適合簡單的文本替換和搜索,sed讀取一行,以行作為單位,進行處理。
awk:每次讀入一行來處理的(同sed),但awk讀取一行,切割成字段,以字段(列)為單位,進行細(xì)節(jié)處理。
相關(guān)推薦:《Linux視頻教程》