sed和awk有什么区别?

581
  • awk和sed有什么区别?
  • sed和awk工具最适合哪些应用场景?

4
在unix.stackexchange上有一个相关的问题和答案:是否有grep、awk和sed的基础教程? - Dani
https://pediaa.com/difference-between-sed-and-awk/#sed%20vs%20awk%20%20-%20Comparison%20of%20Key%20Differences - Hamza Belmellouki
看看这个问题及其答案,https://dev59.com/laXja4cB1Zd3GeqPYvC_。我相信你会有所感触。 - Bruce
3个回答

650

sed是一种流编辑器,它以每行为基础处理字符流。它具有原始的编程语言,包括goto式循环和简单条件(除了模式匹配和地址匹配)。基本上只有两个“变量”:模式空间和保留空间。脚本的可读性可能会很难。在最佳情况下,数学运算非常笨拙。

有各种版本的sed,支持不同程度的命令行选项和语言特性。

awk以每行为基础,面向分隔字段。它具有更强大的编程结构,包括if/elsewhiledo/whilefor(C风格和数组迭代)。它完全支持变量和单维关联数组加上(据我认为)不太优雅的多维数组。数学运算类似于C。它还有printf和函数。在“Aho和Weinberger”的人名中,“AWK”的“K”代表着“Kernighan”,即《C程序设计语言》一书的作者之一(也不能忘记Aho和Weinberger)。使用awk可以构建学术抄袭检测器。

GNU awkgawk)具有众多扩展功能,包括最新版本的真正多维数组。还有其他变体的awk,包括mawknawk

这两个程序都使用正则表达式来选择和处理文本。

在文本中存在模式时,我倾向于使用sed。例如,您可以使用以下命令(有改进的空间)将形如“负号后跟一串数字”的文本中所有负数(例如“-231.45”)替换为“会计师括号”形式(例如“(231.45)”):

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

当文本呈现为行和列或者像 awk 所称的“记录”和“字段”时,我会使用 awk。如果我要在一个简单的逗号分隔文件中仅对第三个字段执行类似上述操作,我可能会这样做:

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

当然,这些只是非常简单的例子,无法展示它们各自所提供的全部功能。


11
查看一些扩展 sed 功能的示例,请访问:http://sed.sourceforge.net/#scripts - Dennis Williamson
3
如果我只学会 awk,会有什么不利吗?awk 比 sed 更常用吗? - Steam
8
我的建议是学习两种工具,但更侧重于 awk。许多正则表达式的内容适用于两者(以及其他工具和语言)。对于简单的事情,可以使用 sed,并尽量避免复杂的内容。在 sed 中可以做循环和分支,这非常棒,但生成的命令行复杂且难以阅读。关于你的问题,答案取决于你正在做什么。 - Dennis Williamson
一个链接说 - http://www.vectorsite.net/tsawk_1.html - “然而,Awk并不是万能的。它并不适用于非常大、复杂的任务。” 那么,awk可以处理多大的任务?在这方面,sed又如何比较? - Steam
1
对于在 Mac 上遇到此问题的任何人,只是提供一个提示,请尝试使用“sed -E 's/-([0-9]+.[0-9]*)/(\1)/g'”来执行第一个 sed 示例。 - Daniel Schmidt
显示剩余7条评论

154

1) awk和sed之间有什么区别?

两者都是处理文本的工具。但是awk可以做更多的事情,不仅仅是操作文本。它本身就是一种编程语言,具备大部分编程语言的特点,比如数组、循环、if/else流程控制等等。你也可以在sed中“编程”,但是你不想维护用它编写的代码。

2) sed和awk工具适用于哪些应用程序?

结论:对于非常简单的文本解析,请使用sed。对于其他任何情况,awk更好。实际上,你可以完全放弃sed,只使用awk。由于它们的功能重叠且awk能够做更多的事情,所以只需使用awk。这样还可以减少学习曲线。


12
我认为Sed更容易学习,因此你需要考虑这一点。当你学会精通Awk后,迅速学习Sed可能会非常有用,这样你就能更快地使用它来完成在Awk中还不知道如何完成的任务。 - Didier A.
35
不要放弃 sed's/search/replace'awk 的语法更容易输入,并且大多数情况下这就是你所需要的。 - sjas
2
最好使用混合方法。例如,如果您正在查找巨大文件中的模式,请使用grep查找行号,然后使用sed编辑该行。否则,sed将更慢地处理整个文件。 - Konchog
3
如果你是一名工匠,你会学习如何使用所有的工具,并且知道在什么时候使用哪个工具。如果你只是修理东西,一把锤子和一个螺丝刀可能就足够了。 - pbarney

79

这两个工具都是为了处理文本而设计的,它们都能完成一些任务。

对我来说,区分它们的规则是:如果要自动执行在文本编辑器中手动完成的任务,请使用sed。这就是为什么它被称为流式编辑器。(你可以使用相同的命令在vim中编辑文本)。如果你想要分析文本,比如计算字段数、统计总数、提取和重新组织结构等等,请使用awk

此外,不要忘记grep。如果只想在文本(文件)中搜索/提取某些内容,请使用grep


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接