當大家看到標題時腦中閃過的大概是鋪天蓋地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)囤萤。
取出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組的運維攻城獅鳞骤,歡迎各種姿勢交流窒百。