Perl,Python,AWK和sed有什么区别?

时间:2008-12-14 21:00:05

标签: python perl sed awk language-comparisons

只是想知道它们之间的主要区别是什么?和每种语言的力量(最好使用它)。

编辑:这不是“对比”喜欢话题,只是信息。

5 个答案:

答案 0 :(得分:525)

按照外观,语言为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的'概述'非常不完整;整本书可以写在主题上。)

答案 1 :(得分:88)

在掌握了几十种语言之后,你厌倦了像S. Lott这样的人(看到他对这个问题的有争议的回答,在回答六年之后,这个数字几乎减少了一半(+ 45 / -22))。

Sed是极其简单的命令行管道的最佳工具。在sed master的手中,它适用于任意复杂性的一次性,但除了非常简单的替换管道之外,它不应该用在生产代码中。像's / this / that /.'

这样的东西

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

当你有非常复杂的输入/输出场景时,Perl或Python远比任何版本的awk或sed好得多。从维护和可读性的角度来看,问题越复杂,使用python就越好。但是请注意,一个优秀的程序员可以用任何语言编写可读代码,并且一个坏程序员可以用任何有用的语言编写不可维护的废话,因此如果所述程序员是perl或python的选择可以安全地留给程序员的首选项。熟练而聪明。

答案 2 :(得分:21)

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

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

  • sed的。它有一个固定的,相对简单的工作范围,由读取和检查文件的每一行的想法定义。 sed的设计并不特别易读。它设计得非常小,非常有效,非常小的unix服务器。

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

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

Thing 2 - 通用编程语言。它们具有丰富的语句类型,众多内置数据结构,并且没有可用的线路假设或快捷方式。

  • 的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完成,通常更简单,有时也更快。由于其多处理,shell管道具有一些性能优势。 Python提供了一个subprocess模块,可以让我恢复这些优势。

  2. 需要学习另一种语言。通过Python(或Perl)中的操作,您的实现取决于更少的语言,从而提高了清晰度。

答案 3 :(得分:20)

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

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

Perl和Python是完全成熟的通用编程语言。 Perl的根源在于文本处理,并且有许多类似awk的结构(甚至还有一个awk-to-perl脚本在网上浮动)。 Perl和Python之间存在很多差异,最好的办法是阅读维基百科等两种语言的摘要,以便更好地掌握它们的含义。

答案 4 :(得分:12)

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

我认为S. Lott略微错过了这项建议。事实上,在Linux和其他UNIX环境中,awk是一个与bash,sh和ksh一起用于快速文本处理的有用工具。脚本本身的想法是通过将此工具与该工具粘合在一起来解决您的问题。因此,在管理脚本中,通常有ls,grep,|,awk,time,ps等。每个脚本工具都像砖块一样逐层组合以完成构建(以解决手头的问题) 。

例如,我是管理paintball gear supplies网络公司的团队的团队成员。此电子商务站点基于LAMP堆栈。为了自动处理和规范化来自不同供应商的数据源到后端数据库,我们采用并维护多种脚本组合,包括bash,perl,php,甚至是期望。每个都有自己的优势,基于可用的模块和API。在bash脚本中,我们使用awk根据需要对模式进行快速模式匹配和相应操作,而无需切换到PERL。我还想指出的一点是,线程中没有强调的是,相当数量的这些脚本是从开源购买的,或者是从开源获得的。如果脚本是Perl,我们将其保存为Perl;如果脚本是Php,我们将其保持为Php;如果它是bash,我们将它保持为bash;我们不会仅仅因为我们认为它在原始语言中效率较低而不能用另一种语言重写它。