Perl,Python,AWK和sed有什么区别?[关闭]


253

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

编辑:不是“ vs”。就像话题,只是信息。


142
这些类型的非建设性问题确实很有帮助。
2013年

10
当然,在首页上的标签找到它们会很方便...

有关命令行上python的有用性,请参见pyp
Neil McGuigan

Answers:


550

在出现的顺序,语言是sedawkperlpython

sed程序是一个流编辑器,旨在将脚本中的操作应用于输入文件的每一行(或更一般而言,应用于指定的行范围)。它的语言基于edUnix编辑器,尽管它具有条件等,但是很难处理复杂的任务。您可以用它创造一些小奇迹-但要花很多钱。但是,当尝试在其权限范围内执行任务时,它可能是最快的程序。(它具有所讨论程序的功能最弱的正则表达式-足以满足许多目的,但肯定不是PCRE-与Perl兼容的正则表达式)

awk程序(以其作者的名字缩写命名-Aho,Weinberger和Kernighan)最初是用于格式化报告的工具。它可以用作汤sed。在最新版本中,它在计算上是完整的。它使用了一个有趣的想法-该程序基于“模式匹配”和“模式匹配时采取的动作”。这些模式非常强大(扩展正则表达式)。动作的语言类似于C。的主要功能之一awk是它将输入自动分为记录,每个记录又分为字段。

Perl的部分编写是awk杀手和sed杀手。附带的两个程序是a2ps2p用于将awk脚本和sed脚本转换为Perl。Perl是下一代脚本语言中最早的一种(Tcl / Tk可能声称是首要的)。它具有功能强大的集成正则表达式处理功能,并且语言功能强大得多。它提供对几乎所有系统调用的访问,并具有CPAN模块的可扩展性。(既不是可扩展的,awk也不sed是可扩展的。)Perl的座右铭之一是“ TMTOWTDI-做到这一点的方法不止一种”(发音为“ tim-toady”)。Perl有“对象”,但它不仅仅是语言的基本组成部分,而是附加组件。

Python是最后编写的,可能部分是对Perl的反应。它具有一些有趣的句法概念(缩进以指示级别-没有大括号或等效项)。从根本上说,它比Perl更面向对象。它与Perl一样可扩展。

OK-什么时候使用每个?

  • Sed-需要对文件进行简单的文本转换时。
  • Awk-当您只需要简单的格式设置,数据汇总和转换时。
  • Perl-适用于几乎所有任务,尤其是当任务需要复杂的正则表达式时。
  • Python-完成与Perl相同的任务。

我不知道Perl可以做Python无法做到的任何事情,反之亦然。两者之间的选择将取决于其他因素。我在没有Python之前就学习了Perl,所以我倾向于使用它。Python的语法较少,而且通常更易于学习。Perl 6上市后,将是一个引人入胜的发展。

(请注意,尤其是Perl和Python的“概述”还很不完整;整本书都可以写成该主题。)


82
A ++++帖子,会再读一次!
罗伯特·格兰伯

24
特别棒的“何时使用”部分
Khaled Al Hourani

6
请注意,python的禅宗基本上是TMTOWTDI的对立面,所以我想这可能是对perl的反应。iirc TCL仅次于perl,并且对perl也相当反作用,尽管TCL的反应是语法和语言复杂性,而不是做事的方式
jk。

7
不管最初的意图是什么,很明显,与Perl更灵活但简洁的语法相比,以后的Python开发和python社区更喜欢可读性和一致性。乔纳森(Jonathan)
马丁·贝克特

4
@blasto:对于ETL,我会优先考虑awksed学习(虽然双方仍然有其用途)。关于任务的大小:sed最好是一次处理一行,每行之间没有存储。 awk通常用于建立从所有来源累积的数据的关联数组;它使用更多的内存,因此与大数据集相比,sed它更有可能遇到大数据集问题。tsawk在您链接到它之前,我还没有听说过。当任务太多时,我倾向于使用Perl(但是您可能会更好地使用Python)awk
乔纳森·莱夫勒

91

掌握了数十种语言后,您会厌倦像S. Lott这样的人(请参阅他对此问题的有争议的答案,在回答六年后,向下投票的比例几乎是向上投票的一半(+ 45 / -22))。

Sed是用于极其简单的命令行管道的最佳工具。在sed管理员的手中,它适合一次性复杂的应用程序,但除非常简单的替换管道外,不应在生产代码中使用。诸如“ s / this / that /”之类的东西。

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

当您有非常复杂的输入/输出方案时,Perl或Python远远优于任何版本的awk或sed。从维护和可读性的角度来看,问题越复杂,使用python的效果就越好。但是请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写无法维护的废话,因此,如果说Perl或python是程序员,则可以放心地选择perl或python熟练而聪明。


9
100%同意。知道最多(如果不是全部)的工具以及何时使用每种工具,是区分优秀技术人员和普通技术人员的区别。
ata

6
我将补充说,选择Python或Perl而不是awk的另一个原因是,当您的转换需求涉及复杂的验证或逻辑时,另一种语言已经针对该逻辑或逻辑提供了可靠的模块。考虑一下如何正确处理awk中的电子邮件或街道地址,您会明白我的意思:perl和python的库使这种琐碎的事情变得微不足道,而awk中这些库并不常见或不可用。
sorpigal 2012年

3
实际上,正如Perl旨在同时包含Sed和Awk一样;我发现只用Perl编写它比学习Sed或Awk更容易。
布拉德·吉尔伯特

@BradGilbert:就像我在最上面的答案中提到的那样,关于awk的Perl(&Python,ruby等)的警告是,前者的某种regexp的速度变慢了:swtch.com/~rsc/regexp/regexp1.html
奥利维尔·杜拉克

1
@OlivierDulac是的,这表明病理情况。如果从更改为a?ⁿaⁿa??ⁿaⁿ然后在Perl 5中以1,000,000的价格运行它,将在不到两秒钟的时间内运行。time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'如果您运行朴素的代码,则只花25 秒钟就超过了2秒。您必须意识到的是,Perl具有比那些更快的regex功能更多的regex功能,包括允许您在regex中包含Perl代码以改变其匹配项。 。如果需要,您可以实现一个模块,以将内置模块交换为其他模块。
布莱德·吉尔伯特

21

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

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

Perl和Python是成熟的通用编程语言。Perl扎根于文本处理,并具有许多类似awk的构造(甚至网上都有awk-to-perl脚本浮动)。Perl和Python之间有很多区别,您最好的选择可能是在Wikipedia等上阅读两种语言的摘要,以更好地了解它们的含义。


2
我已经看到了推箱子的sed实现,这暗示着图灵完整性。但是,也可以说sendmail.cf和TeX。
ConcernedOfTunbridgeWells

7
我曾经和一个写过PostScript的人合作过,他将激光打印机变成路由器。
山姆·金顿

10
@Sam:哇!我不知道可以将打印机的激光器调高到足以砍木头的速度!哦,对不起,路由器类型错误。
暂停,直到另行通知。

2
sed,不是完整的语言?好吧,这并不完全正确,因为sed即将完成;)
Bernard paulus

1
我已经在awk中看到了第四种语言的实现。(由于awk本身可以被视为解析器,因此在其中实现解释器非常简单)。
Tatjana Heuser 2014年

19

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

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

  • sed。它具有固定,相对简单的工作范围,该范围由读取和检查文件的每一行的想法定义。sed并非旨在使其特别可读。它被设计为在非常小的Unix服务器上非常小且非常高效。

  • w 它的固定性稍差,工作范围也较简单。但是,awk程序的主循环是通过隐式读取源文件的行来定义的。

这些不是“完整的”编程语言。尽管您可以通过一些工作用awk编写相当复杂的程序,但它很快变得复杂且难以阅读。

第2件事-通用编程语言。它们具有丰富的语句类型,大量的内置数据结构,并且没有任何固定的假设或捷径可言。

  • Perl。

  • 蟒蛇。

什么时候使用它们。

  • sed。决不。在内存超过32K的现代计算机中,它确实没有任何价值。Perl或Python更清楚地执行了相同的操作。

  • w 决不。像sed一样,它反映了更早的计算时代。与其维护这种语言(除了一个成功的系统所需的所有其他语言),不如简单地用一种令人愉悦的语言来做所有事情。

  • Perl。任何形式的编程问题。如果您喜欢自由思考的语法,并且有很多很多方法可以执行相同的操作,那么perl很有趣。

  • 蟒蛇。任何形式的编程问题。如果您喜欢语法相当有限的语法,那么其中的选择更少,细节更少,并且(也许)更加清晰。Python的面向对象特性使其更适合于大型复杂问题。

背景-我并不是因为无知而抨击sed和awk。我20多年前学过awk。它做了很多事情;曾经将其作为Unix的核心技能来教授。我大约15年前学习了Perl。做了很多复杂的事情。我把两者都抛在后面是因为我可以在Python中做同样的事情-而且更简单,更清晰。

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

  1. 其实施不完整。sed和awk所做的一切都可以在Python或Perl中完成,通常更简单,有时也更快。Shell管道由于具有多重处理而具有一些性能优势。Python提供了一个subprocess模块,使我可以恢复这些优势。

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


66
一些反对awk / sed的致命论点。出于sed和awk仍在发货的相同原因,活动扳手没有取代开口扳手。有时,简单的工具最适合工作。我写了很多perl,但是对于简单的管道命令链,awk / sed比perl -e更快
RET

27
在大多数非Linux UNIX系统上,除了sh,sed和awk之外,您都不能假设有任何其他可用性。如果您希望某些东西可以在现成的Solaris,HP / UX或AIX安装中工作,那么sed和awk就会困扰您。
ConcernedOfTunbridgeWells

27
我一半的shell脚本使用sed或awk。他们还没有死。Python是我首选的脚本语言,但有时sed和awk是完成这项工作的最佳工具。仅仅因为它们已经使用了多年,并不意味着它们已经过时了。
杰里米·坎特雷尔

16
@ S.Lott:我并不是建议任何人都应该尝试在awk中构建Web应用程序,但是要说永远不要使用它们是有点可笑的。对于简单的s&r和/或调整(尤其是分隔文本文件),perl -e或python -c永远不会像sed / awk单行代码那样高效。
RET

25
我不喜欢这样的答案。Sed和awk在数小时内易于理解,并且比完整的语言更轻量和广泛可用。Shell编程一如既往地相关,说“从不”使用此工具,否则该工具将被简化。但是,这个受阻的想法难道不是Perl出现的基础之一吗?哦,很好
ata

14

何时使用它们:awk-永远不会-S. Lott。

我认为洛特(S. Lott)对此建议略有遗漏。事实是,在Linux和其他UNIX环境上,awk是与bash,sh和ksh一起用于快速文本处理的有用工具。脚本本身的想法是,您可以通过将该工具(即该工具)粘合在一起来解决问题。因此,在管理脚本中,通常具有ls,grep,|,awk,time,ps等。每个脚本编写器都将其组合为一个工具,就像构建器一砖一瓦地完成建筑(解决当前的问题) 。

例如,我是团队管理的团队成员 彩弹装备互联网。该电子商务网站基于LAMP堆栈。为了自动处理和标准化来自各个供应商的数据馈入后端数据库,我们采用并维护了多种脚本组合,包括bash,perl,php甚至期望。每个模块都有其优势,这取决于可用的模块和API。在bash脚本中,我们使用awk进行模式的快速模式匹配和适当的操作,而无需切换到PERL。我还想指出的一件事是,这些脚本中有相当一部分是从开放源代码中购买或获得的,而在线程中并未强调。如果脚本以Perl的形式出现,则我们将其保留为Perl;如果脚本以Php格式出现,我们将其保持为Php;如果它是bash,我们将其保持为bash;


7
是S.Lott撰写了您引用的回复,而不是brian d foy ...
plusplus 2010年

5
作为这个相当老的答案的附注:永远不要解析的输出ls,请改用glob。读这个。
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.