2009-10-27 49 views
389
  • awk 和sed有什麼區別?
  • 什麼樣的應用程序最好使用 案件的sed和awk工具?
+1

unix.stackexchange上的相關QA:[是否有grep,awk和sed的基本教程?](http://unix.stackexchange .com/questions/2434/is-there-a-basic-tutorial-for-grep-awk-and-sed) – Dani

回答

438

sed是一個流編輯器。它可以在每行字符的基礎上處理字符流。它有一個原始的編程語言,包括goto風格的循環和簡單的條件(除了模式匹配和地址匹配)。基本上只有兩個「變量」:模式空間和保存空間。腳本的可讀性可能很難。數學運算充其量是非常尷尬的。

sed有多種版本,對命令行選項和語言功能提供不同級別的支持。

awk面向按行定界的字段。它具有更強大的編程結構,包括if/else,while,do/whilefor(C風格和數組迭代)。完全支持變量和單維聯合數組加上(IMO)kludgey多維數組。數學運算與C中的類似。它具有printf和函數。 「AWK」中的「K」代表「C編程語言」名聲(不忘記A ho和W einberger)中的「Kernighan和Ritchie」中的「K ernighan」。可以設想使用awk來撰寫學術剽竊檢測器。

GNU awkgawk)有很多擴展,包括最新版本中的真正的多維數組。還有awk的其他變體,包括mawknawk

這兩個程序都使用正則表達式來選擇和處理文本。

我傾向於使用sed其中有文字模式。例如,您可以用「會計人員的括號」表格(例如「(231)」)替換某些文本中「負號後跟數字序列」形式的所有負數(例如「-231.45」)。45)「)使用這個(其中有改進的餘地):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile 

我會用awk當文本看起來更像行和列,或如awk指他們‘記錄’和‘田’如果。我打算做如上類似的操作,但只在一個簡單的逗號分隔的文件中的第三場我可能會做這樣的事情:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile 

當然這些只是非常簡單的例子不說明全方位的能力,每個都必須提供。

+3

謝謝丹尼斯的及時解釋。 – Rachel

+3

要查看推動'sed'邊界的一些示例:http://sed.sourceforge.net/#scripts –

+3

謝謝丹尼斯提供sed示例的鏈接 – Rachel

94

1)awk和sed有什麼區別?

兩者都是轉換文本的工具。但除了操作文本之外,awk還可以做更多的事情。它本身就是一種編程語言,其中包含大部分編程中學到的東西,比如數組,循環,if/else流控等等。您也可以在sed中「編程」,但是您不希望維護寫在其中的代碼。

2)什麼樣的應用程序是sed和awk工具的最佳用例?

結論:使用sed進行非常簡單的文本解析。除此之外,awk更好。事實上,你可以完全拋棄sed並使用awk。由於它們的函數重疊,並且awk可以做更多,所以只需使用awk。你也會減少你的學習曲線。

+5

關於學習曲線的好處..太多的工具可能會混淆..所以我寧願學習grep和awk只..讓我們忘記sed :) – Outlier

+104

^^足夠的sed。 (對不起,我必須) –

+3

雖然我發現sed更容易學習,所以你需要解釋它。當您學習掌握awk時,快速學習sed以便能夠更快地使用它,對於您可能不知道如何在awk中執行的操作可能會很有用。 –

30

這兩種工具都是用於處理文本,並且有兩種工具都可以用來執行任務。

對我來說,將它們分開的規則是:使用sed自動執行您在文本編輯器中手動執行的任務。這就是爲什麼它被稱爲流編輯。 (你可以使用相同的命令在vim中編輯文本)。使用awk如果你想分析文本,意義計數字段,計算總數,提取和重組結構等。

也你不應該忘記grep。使用grep如果您只想搜索/提取文本(文件)中的某些內容