Unix & Linux的文本處理工具 -- grep, sed & awk

當大家看到標題時腦中閃過的大概是鋪天蓋地baidu, google出來的冗余的各類使用介紹,老生常談希望能讓大家對這三個文本工具有新的理解略吨。

1炎疆、grep

grep不做過多的介紹, 打印出匹配的行勾拉, 著重點在于輸出結果并不對文本本身做修改煮甥。

有個關于grep的小故事, 從sed和grep能追溯到最初的unix行編輯器ed而grep的命名代表 g(全局)/re(正則表達式)/p(打印)正是ed中全局打印行匹配的語法. grep自身的劣勢在于無法實現(xiàn)多行匹配, 這時sed和awk相繼出現(xiàn)彌補了grep的不足藕赞。

2成肘、sed和awk的比較

在進入sed的相關討論之前,先就sed跟awk之間進行簡單的比較斧蜕。

1. 相似性

可使用指定的腳本文件對相應文本進行編輯双霍。

sed -f 'script filename' or stdin

awk -f 'script filename' or stdin

默認全局匹配并且擁有自身的主輸入循環(huán)。

除去影響控制流的命令或語句(sed中: t批销,b; awk中continue洒闸,break等)默認對文本的每一讀取的行依次執(zhí)行相應的命令或語句。

2. 優(yōu)劣性

awk相較于文本編輯工具更像是一門語言均芽,awk條件丘逸、循環(huán)、判斷語句有顯性的標識(if掀宋,while深纲,for...)仲锄;而sed只存在單一的判斷邏輯(參考b label,t label)囤萤。

(采用nginx的配置文件格式)

取出upstream awk_test對應的配置塊:

Solution1:

Solution2:

相較之下Solution 2不需要復雜的判斷昼窗,只需通過尋址來匹配并打印相應的文本;Solution 1更適合于進行多行匹配并替換涛舍。另一方面澄惊,Solution 1中sed通過創(chuàng)建多行空間模式并輸出,而awk通過修改記錄分隔符來實現(xiàn)多行匹配的不同富雅。

awk擁有系統(tǒng)變量(FS掸驱,RS,OFS没佑,ORS...)毕贼、內(nèi)置函數(shù)、數(shù)組數(shù)據(jù)結構蛤奢、傳參(-v var=value)鬼癣、引用系統(tǒng)命令(通過system() getline() close()函數(shù))等。


awk除去主輸入循環(huán)還存在BEGIN和END過程啤贩,用于某些在處理輸入之前或者處理輸入完成之后的操作待秃。


sed也有過人之處,如果對sed的工作模式進行深入了解痹屹,會發(fā)現(xiàn)有一個叫做保持空間(hold space)的東西章郁,下圖大體描述了sed的工作模式,并且闡述了模式空間(pattern space)跟保持空間(hold space)之間的聯(lián)系志衍。模式空間跟保持空間中的內(nèi)容可進行刪除暖庄,交換等。

sed的指令集都是單一的字母楼肪,并且有option可直接修改文件培廓。而awk可能需要指定內(nèi)置變量的值,或是通過輸出重定向保存為新的文件淹辞。


結語

綜上所述:

grep適用于單行匹配打印的場景医舆;

sed適用于多行模式的替換的場景;

awk適合更多的邏輯表達式并輸出的場景象缀。

但三個命令都需要文本格式統(tǒng)一化的大前提蔬将,對于一個文本中的多種格式,可以先將同一種格式的內(nèi)容整理到文件中央星,再將其他格式再分別整理到新的文件中霞怀。

統(tǒng)一文本格式固然重要,能準確匹配意圖的正則表達式也必不可少莉给,這也是大家頭疼的部分毙石。如若有機會廉沮,我會再跟大家介紹文本匹配中磨人的小妖精——正則表達式。它在不同的命令中徐矩、語言中支持不同的標準滞时,更易于與Unix-like系統(tǒng)的file globbing混淆,常常讓人咬牙切齒滤灯,欲罷不能坪稽。

本文作者:王嚴(點融黑幫),隸屬于點融Infra團隊的devops組的運維攻城獅鳞骤,歡迎各種姿勢交流窒百。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豫尽,隨后出現(xiàn)的幾起案子篙梢,更是在濱河造成了極大的恐慌,老刑警劉巖美旧,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渤滞,死亡現(xiàn)場離奇詭異,居然都是意外死亡榴嗅,警方通過查閱死者的電腦和手機蔼水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來录肯,“玉大人,你說我怎么就攤上這事吊说÷塾剑” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵颁井,是天一觀的道長厅贪。 經(jīng)常有香客問我,道長雅宾,這世上最難降的妖魔是什么养涮? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮眉抬,結果婚禮上贯吓,老公的妹妹穿的比我還像新娘。我一直安慰自己蜀变,他們只是感情好悄谐,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著库北,像睡著了一般爬舰。 火紅的嫁衣襯著肌膚如雪们陆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天情屹,我揣著相機與錄音坪仇,去河邊找鬼。 笑死垃你,一個胖子當著我的面吹牛椅文,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜡镶,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼雾袱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了官还?” 一聲冷哼從身側響起芹橡,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎望伦,沒想到半個月后林说,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡屯伞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年腿箩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣摇。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡珠移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出末融,到底是詐尸還是另有隱情钧惧,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布勾习,位于F島的核電站浓瞪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巧婶。R本人自食惡果不足惜乾颁,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艺栈。 院中可真熱鬧英岭,春花似錦、人聲如沸湿右。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诅需。三九已至漾唉,卻和暖如春荧库,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赵刑。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工分衫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人般此。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓蚪战,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铐懊。 傳聞我的和親對象是個殘疾皇子邀桑,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,175評論 2 33
  • 本文承接之前寫的三十分鐘學會AWK一文,在學習完AWK之后科乎,趁熱打鐵又學習了一下SED壁畸,不得不說這兩個工具真的堪稱...
    mylxsw閱讀 4,401評論 3 74
  • 知識點 sort uniq cut wc sed命令 awk命令 crontab定時器 sort sort 命令對...
  • grep grep的基本用法 grep命令是支持正則表達式的一個多用途文本搜索工具,一般格式為 grep 選項 模...
    王詩翔閱讀 3,063評論 2 34
  • sed與awk實例 文本間隔 在每一行后面增加一空行 將原來的所有空行刪除并在每一行后面增加一空行茅茂。這樣在輸出的文...
    stuha閱讀 1,901評論 0 21