当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Perl,Python,AWK和sed有什么区别?》经验,为你挑选了5个好方法。

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

编辑:这不是"对战" 喜欢话题,只是信息.



1> Jonathan Lef..:

在出现的顺序,语言是sed,awk,perl,python.

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一样可扩展.

好的 - 什么时候使用?

sed - 当你需要对文件进行简单的文本转换时.

awk - 当您只需要简单的格式化和汇总或数据转换时.

perl - 几乎任何任务,但尤其是当任务需要复杂的正则表达式时.

python - 对于你可以使用Perl的相同任务.

我不知道Perl可以做什么,Python不能,反之亦然.两者之间的选择取决于其他因素.我在Python之前学过Perl,所以我倾向于使用它.Python具有较少的语法,通常更容易学习.Perl 6,当它可用时,将是一个迷人的发展.

(请注意,特别是Perl和Python的'概述'非常不完整;整本书可以写在主题上.)


A ++++帖子,会再次阅读!
真棒,特别是"何时使用每个"部分
无论最初的意图是什么,很明显后来的Python开发和python社区比Perl更灵活但简洁的语法更喜欢可读性和一致性.优秀的职位乔纳森
注意python的禅基本上是TMTOWTDI的对立面,所以我想它可能是对perl的反应.虽然TCL的反应在于语法和语言的复杂性,但不是做事的方法,所以Iirc TCL在perl之后略有下降并且对perl也相当反动.
@blasto:对于ETL,我将'awk`优先于`sed`进行学习(尽管两者仍有其用途).至于任务的大小:`sed`是最好的,它一次处理一行,没有从一行到另一行的存储.`awk`通常用于构建关联数组,其中包含从所有源中累积的数据; 它使用更多内存,因此比"sed"更容易遇到大数据集的问题.在你链接之前我没有听说过`tsawk`.当'awk`的任务太多时,我倾向于使用Perl(但你可能会用Python做得更好).
@jk:Tcl/Tk于1987年开发并于1988年首次发布; Perl 1.000于1987年12月发布.我不认为Tcl/Tk是对Perl的反应 - 它是一个独立的发明.Python始于1989年.毕竟,Perl可能对Python(或Tcl/Tk)的基础知识影响不大 - 除非任何语言开发都意识到其他语言的存在(C++,Java,C#, ...).
我不认为Python是对Perl的反应.我的理解是,它开始作为Amoeba(一个unix-ish研究O/S)的脚本语言生活,并且几乎是独立的.

2> 小智..:

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

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

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

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


100%同意.了解最多,如果不是所有工具以及何时使用每种工具,那么优秀技术人员与平庸技术人员的区别就在于此.
我将补充说,选择Python或Perl而不是awk的另一个原因是当您的转换需求涉及复杂的验证或逻辑时,另一种语言具有现有的健壮模块.想想在awk中正确处理例如电子邮件或街道地址需要什么,你会明白我的意思:perl和python都有像这样简单的库,在awk这些是不常见的或不可用的.
实际上,Perl的设计包括Sed和Awk; 我发现在Perl中编写它更容易,而不是学习Sed或Awk.

3> Robert Gambl..:

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

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

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


@Sam:哇!我不知道打印机的激光器可以加速到足以切割木材!哦,抱歉,错误的路由器.
我和曾经写过PostScript的人一起工作,将激光打印机变成了路由器.
我见过Sokoban的sed实现,这意味着Turing Completeness.但是,这也可以说是sendmail.cf和TeX.
sed,不是一门完整的语言?嗯,这并不完全正确,因为[sed is turing complete](http://www.catonmat.net/blog/proof-that-sed-is-turing-complete/);)

4> S.Lott..:

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

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

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

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

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

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

Perl的.

蟒蛇.

何时使用它们.

SED.决不.在具有超过32K内存的计算机的现代时代,它确实没有任何价值.Perl或Python更清楚地做同样的事情.

AWK.决不.像sed一样,它反映了早期的计算时代.而不是保持这种语言(除了成功系统所需的所有其他语言),用一种愉快的语言简单地做所有事情更令人愉快.

Perl的.任何编程问题.如果你喜欢自由思考的语法,那里有许多方法可以做同样的事情,perl很有趣.

蟒蛇.任何编程问题.如果你喜欢相当有限的语法,那么选择较少,微妙,并且(可能)更清晰.Python的面向对象特性使其更适合于大型复杂问题.

背景 - 我不是因为无知而抨击sed和awk.我在20多年前学会了awk.做了很多事情; 曾经把它作为核心unix技能教授.大约15年前我学习了Perl.用它做了许多复杂的事情.我已经抛弃了两个因为我可以在Python中做同样的事情 - 它更简单,更清晰.

sed和awk存在两个严重问题,其中两个都不是他们的年龄.

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

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


一些非常愚蠢的论据反对awk/sed.由于同样的原因,可调式扳手没有取代开口扳手,因此仍然可以使用.有时简单的工具是最好的工作.我写了很多perl,但对于一个简单的管道命令链,awk/sed比perl -e更快
在大多数非Linux unix系统上,你不能假设除sh,sed和awk之外的任何东西.如果您希望在开箱即用的Solaris,HP/UX或AIX安装上运行某些东西,那么您就会遇到sed和awk.
我的一半shell脚本使用sed或awk.他们远没有死.Python是我首选的脚本语言,但有时候sed和awk是这项工作的最佳工具.仅仅因为它们已经使用了很多年,并不意味着它们已经过时了.
我不喜欢这样的答案.Sed和awk在几个小时内易于理解,并且比完全成熟的语言更轻便,更广泛.Shell编程与以往一样具有相关性,称"永远不会"使用这个或那个工具只是简单的延迟.但是,这个迟钝的想法不是Perl出现的基础之一吗?那好吧 -
@ S.Lott:我并不是说任何人都应该尝试在awk中构建一个web应用程序,但是说它们永远不应该被使用有点过分了.对于简单的s&r和/或调整(特别是对于分隔的文本文件),perl -e或python -c永远不会像sed/awk单行程一样高效.
@Juaco:"sed和awk很容易理解",他们用更多的语法和更多的语义规则混淆了我有限的大脑空间.它们可能是"简单的",但它只是两种不会增加重要价值的语言."货源充足"?Python默认情况下可以在任何地方使用.与sed和awk相同.答案从未提及shell编程."从不"是一个重要的词.它使人们思考永远无法完全枚举的异常和特殊情况.
@RET:我有理由采取强势立场.它们应该被视为与perl和python不同; 无关.自从我开始使用Python进行所有脚本编写以来,它们无法解决我曾经遇到过的问题.
我完全支持这个答案!我已经大量使用sed,Perl和Python。让sed的棺材平安无事。
人们一直在谈论Python,就像它的装配一样.我没有使用Perl,Awk或SED,但Python的语法比我使用过的任何其他语言(Java,C++,C#,Vala,Visual Basic等)都要灵活得多,除了Lua.Lua非常灵活.说Python的语法不灵活就像说草不是绿色的,除非它在英格兰.也许它不如某些语言灵活,但它可能仍然非常灵活,而不是大多数的东西.
没有什么能比得上像'awk'$ 5> 100'file.txt`这样的东西

5> 小智..:

何时使用它们:awk - never - 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; 我们不会仅仅因为我们认为它在原始语言中效率较低而不能用另一种语言重写它.


正是S.Lott写了你引用过的回复,而不是brian d foy ......
作为这个相当古老的答案的旁注:从不解析`ls`的输出,而是使用glob.[读这篇.](http://mywiki.wooledge.org/ParsingLs)
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有