2009-10-27 38 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如果您只想搜索/提取文本(文件)中的某些内容