sed和awk有什么区别?[关闭]


497
  • awk和sed有什么区别?
  • sed和awk工具的最佳用例是哪种应用程序?

2
有关unix.stackexchange的质量检查:是否存在有关grep,awk和sed的基本教程?
Dani

Answers:


549

sed是流编辑器。它每行处理字符流。它具有一种原始的编程语言,其中包括goto式循环和简单的条件(除了模式匹配和地址匹配之外)。本质上只有两个“变量”:模式空间和保持空间。脚本的可读性可能很困难。数学运算充其量是非常笨拙的。

有各种版本的sed命令行选项和语言功能具有不同级别的支持。

awk每行都面向定界字段。它具有更强大的编程构造包括if/ elsewhiledo/ whilefor(C-风格和阵列迭代)。完全支持变量和一维关联数组以及(IMO)跳越多维数组。数学运算类似于C中的运算。它具有printf和函数。“ AWK”中的“ K ”代表“ K ernighan”,就像《 C编程语言》一书中的“ Kernighan and Ritchie”一样(不要忘记A ho和W einberger)。可以想象,可以使用编写一个学术窃的检测器awk

GNU awkgawk)具有许多扩展,包括最新版本中的真正多维数组。awk包括mawk和的其他变化nawk

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

我倾向于使用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

当然,这些只是非常简单的示例,并未说明每个示例必须提供的全部功能。



@DennisWilliamson-如果我仅学习awk,我是否处于不利地位?awk比sed更常用吗?
2013年

4
@blasto:我的建议是同时学习两者,但更多地关注awk。正则表达式很多东西都适用于(以及其他工具和语言)。使用sed处理简单的内容,并尽量避免使用复杂的内容。您可以在sed中执行循环和分支确实很酷,但是生成的命令行非常复杂且难以阅读。问题的答案实际上取决于您在做什么。
暂停,直到另行通知。

@DennisWilliamson-对于ETL开发人员来说,最有用的是什么?ETL或“提取转换并加载”是一个数据仓库术语。简而言之,这项工作涉及从不同来源(例如数据库,Excel文件,csv文件等)中提取数据,进行相同的转换,然后加载到数据仓库(DW)中进行分析,查找数据模式或只是历史数据记录。例如。DW的最终用途-应用于杂货店DW的算法(该算法具有过去10年的数据)可能表明,倾向于购买苹果的人也会购买橙子或类似的东西。
2013年

1
对于任何在Mac上遇到麻烦的人来说,这只是一个FYI,对于第一个sed示例,请尝试“ sed -E's /-([0-9] +。[0-9] *)/(\ 1)/ g'”
丹尼尔·施密特

124

1)awk和sed有什么区别?

两者都是用于转换文本的工具。但是awk不仅可以处理文本,还可以做更多的事情。它本身就是一种编程语言,它包含您在编程中学习的大多数知识,例如数组,循环,if / else流控制等。您也可以对sed进行“编程”,但是您不想保留其中编写的代码。

2)sed和awk工具的最佳用例是哪种应用程序?

结论:使用sed进行非常简单的文本解析。除此之外,awk更好。实际上,您可以完全放弃sed,而仅使用awk。由于它们的功能重叠并且awk可以做更多的事情,所以只需使用awk。您还将减少学习曲线。


7
关于学习曲线的好点..太多的工具可以混用..所以我宁愿只学习grep和awk ..让我们忘记sed :)
2014年

174
^^足够了。(对不起,我不得不)
Greg M. Krsak 2014年

8
我发现sed更容易学习,因此您需要考虑到这一点。当您学习掌握awk时,快速学习sed以便对您可能尚不知道如何在awk中做的事情更快地使用它可能会很有用。
Didier A.

1
@GregKrsak,你过得很愉快。(对不起,我不得不这样做)
Abel Callejo

15
不要沟渠sed's/search/replace'awk的语法更容易输入,这是您大多数时候需要的。
sjas

54

两种工具都旨在处理文本,并且两种工具都可以执行某些任务。

对我而言,将它们分开的规则是:sed用于自动执行任务,否则您将在文本编辑器中手动执行。这就是为什么它被称为流编辑器。(您可以使用相同的命令在vim中编辑文本)。使用awk,如果你要分析文本,这意味着计数领域,计算总计,提取和重新组织结构等等。

另外,您也不应该忘记grep。使用grep,如果你只想搜索文本(文件)/提取物的东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.