Perl、Python、AWK和sed之间有什么区别?

它们之间的主要区别是什么?在哪些典型场景中使用每种语言更好?

88083 次浏览

我不会称sed为一种成熟的编程语言,它是一种流编辑器,具有旨在以编程方式编辑文本文件的语言结构。

Awk是一种更通用的语言,但它仍然最适合文本处理。

Perl和Python是成熟的通用编程语言。Perl起源于文本处理,并具有许多类似awk的构造(网络上甚至有一个awk-to-perl脚本)。Perl和Python之间有许多不同之处,您最好的选择可能是在维基百科之类的网站上阅读这两种语言的摘要,以很好地掌握它们是什么。

按照出现的顺序,这些语言是sedawkperlpython

sed程序是一个流编辑器,被设计用于将脚本中的操作应用到输入文件的每一行(或者更一般地,应用到指定的行范围)。它的语言基于ed, Unix编辑器,尽管它有条件等等,但它很难用于复杂的任务。你可以用它创造小奇迹——但要付出你头上的头发的代价。然而,当尝试在其职权范围内的任务时,它可能是最快的程序。(它具有所讨论的程序中最不强大的正则表达式-足以满足许多目的,但肯定不是PCRE - perl兼容的正则表达式)

awk程序(名字来自其作者的首字母- Aho, Weinberger和Kernighan)最初是一个用于格式化报告的工具。它可以用作增强的sed;在最近的版本中,它的计算是完整的。它使用了一个有趣的想法——程序是基于“模式匹配”和“模式匹配时采取的行动”。模式相当强大(扩展正则表达式)。用于操作的语言类似于c语言。awk的一个关键特性是它自动将输入分割为记录,并将每个记录分割为字段。

Perl在某种程度上是作为awk-杀手和sed-杀手编写的。它提供的两个程序是a2ps2p,用于将awk脚本和sed脚本转换为Perl。Perl是最早的下一代脚本语言之一(Tcl/Tk可能是最主要的)。它具有强大的集成正则表达式处理,使用的语言功能强大得多。它提供了对几乎所有系统调用的访问,并具有CPAN模块的可扩展性。(awksed都不是可扩展的。)Perl的格言之一是“TMTOWTDI—有不止一种方法可以做到这一点”(发音为“tim-toady”)。Perl有“对象”,但它更像是一种附加组件,而不是语言的基本组成部分。

Python是最后写的,在某种程度上可能是对Perl的反应。它有一些有趣的语法思想(缩进来表示级别-没有大括号或等量词)。它从根本上比Perl更面向对象;它就像Perl一样可扩展。

好的,什么时候使用它们?

  • Sed -当您需要对文件进行简单的文本转换时。
  • Awk -当你只需要简单的格式和总结或转换数据。
  • Perl—几乎适用于任何任务,但当任务需要复杂的正则表达式时尤其如此。
  • Python -用于可以使用Perl完成的相同任务。

我不知道Perl能做而Python不能做的任何事情,反之亦然。两者之间的选择取决于其他因素。我在Python出现之前就学会了Perl,所以我倾向于使用它。Python的语法较少,通常比较容易学习。当Perl 6可用时,它将是一个迷人的开发。

(请注意,特别是Perl和Python的“概述”是不完整的;关于这个话题可以写一整本书。)

首先,列表中有两个不相关的东西“Perl, Python awk和sed”。

事情1 -简单的文本操作工具。

  • sed。它有一个固定的、相对简单的工作范围,该范围由读取和检查文件的每一行的思想定义。Sed并不是特别设计为可读的。它被设计成非常小,在非常小的unix服务器上非常高效。

  • awk。它的工作范围稍微不那么固定和简单。然而,awk程序的主循环是通过隐式读取源文件的行来定义的。

这些都不是“完整的”编程语言。虽然您可以(通过一些工作)在awk中编写相当复杂的程序,但它很快就会变得复杂且难以阅读。

第二件事——通用编程语言。它们具有丰富的语句类型、大量内置的数据结构,并且没有所谓的内置假设或快捷方式。

  • Perl。

  • Python。

什么时候使用它们。

  • sed。从来没有。在内存超过32K的现代计算机时代,它真的没有任何价值。Perl或Python更清楚地做同样的事情。

  • awk。从来没有。和sed一样,它反映了早期的计算时代。与其维护这种语言(以及成功系统所需的所有其他语言),不如简单地用一种令人愉快的语言完成所有事情。

  • Perl。任何类型的编程问题。如果你喜欢自由思考的语法,有很多很多方法来做同样的事情,perl很有趣。

  • Python。任何类型的编程问题。如果您喜欢相当有限的语法,选择更少,不那么微妙,(可能)更清晰。Python的面向对象特性使它更适合处理大型复杂问题。

背景——我不是出于无知而抨击sed和awk。我20多年前就学会了awk。用它做了很多事情;用来教授核心Unix技能。我大约在15年前学习了Perl。用它做了很多复杂的事情。我把它们都抛在了后面,因为我可以在Python中做同样的事情——而且它更简单、更清楚。

sed和awk有两个严重的问题,都不是它们的年龄。

  1. 执行的不完整性。sed和awk所做的一切都可以用Python或Perl完成,通常更简单,有时也更快。由于其多处理,外壳管道具有一些性能优势。Python提供了一个subprocess模块来让我恢复这些优势。

  2. 学习另一种语言的需要。通过使用Python(或Perl),您的实现依赖于更少的语言,从而增加了清晰度。

何时使用:awk - never - S. Lott。

我认为S. Lott的这一建议略微偏离了目标。事实上,在Linux和其他UNIX环境中,awk是与bash、sh和ksh一起用于快速文本处理的有用工具。脚本本身的思想是通过将这个工具和那个工具结合在一起来解决问题。因此,在管理脚本中,通常有ls, grep, |, awk, time, ps等。每个工具都是脚本编写人员使用的工具,就像建造者一砖一瓦地组合起来完成构建(解决手头的问题)。

例如,我是管理彩弹装备供应 . com的团队的一员。这个电子商务网站基于LAMP堆栈。为了自动处理和规范化来自不同供应商的数据馈送到后端数据库,我们使用并维护了多种脚本组合,包括bash、perl、php,甚至expect。基于可用的模块和API,每一种都有自己的优势。在bash脚本中,我们使用awk进行快速模式匹配,并根据需要对模式进行适当的操作,而不需要切换到PERL。我还想指出的一件事是,在这篇文章中没有强调的是,这些脚本中有相当一部分是购买的,或者是从开源中获得的。如果脚本以Perl的形式出现,我们就以Perl的形式维护它;如果脚本是Php的,我们就用Php来维护它;如果它以bash形式出现,我们将其维护为bash;我们不会仅仅因为认为原语言的效率较低就用另一种语言重写它。

在掌握了几十种语言之后,你会对S. Lott这样的人感到厌倦(请看他对这个问题有争议的回答,在回答这个问题六年后,反对票几乎是赞成票的一半(+45/-22))。

Sed是极其简单的命令行管道的最佳工具。在sed管理员手中,它适用于任意复杂程度的一次性代码,但是不应该在生产代码中使用,除非在非常简单的替换管道中使用。比如's/this/that/。'

当只有一个输入源和一个输出(或按顺序写入的多个输出)时,Gawk (GNU awk)是目前为止重新格式化复杂数据的最佳选择。由于大量的现实工作符合这一描述,并且一个优秀的程序员可以在两个小时内学会gawk,因此它是最好的选择。在这个星球上,越简单越快越好!

当您有非常复杂的输入/输出场景时,Perl或Python要比任何版本的awk或sed好得多。从维护和可读性的角度来看,问题越复杂,使用python就越好。然而,请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写不可维护的垃圾代码,因此,选择perl或python可以安全地留给程序员的偏好,如果该程序员技术娴熟且聪明的话。