Perl,Python,AWK和sed有什么区别?
只是想知道它们之间的主要区别是什么? 和每种语言的力量(在哪里使用它更好)。
编辑:这不是“对” 就像话题,只是信息。
按照外观顺序,语言是sed
, awk
, perl
, python
。
sed
程序是一个stream编辑器,旨在将脚本中的操作应用于input文件的每一行(或更一般地说,指定范围的行)。 它的语言是基于Unix编辑器编写的,虽然它有条件等等,但是很难处理复杂的任务。 你可以用它来创造小小的奇迹 – 但是要花费你头上的头发。 但是,在其职权范围内尝试任务时,这可能是程序中速度最快的。 (它具有所讨论程序中function最less的正则expression式 – 适用于多种用途,但肯定不是PCRE-Perl兼容的正则expression式)
awk
程序(来自其作者姓名的名字 – Aho,Weinberger和Kernighan)最初是用于格式化报告的工具。 它可以作为加强的sed
; 在其更新的版本中,它是计算完整的。 它使用一个有趣的想法 – 该程序是基于“模式匹配”和“模式匹配时采取的行动”。 模式相当强大(扩展正则expression式)。 动作的语言与C类似。awk的一个关键特性是它自动将input行分割为字段。
Perl是部分写成awk杀手和杀手的。 其中提供的两个程序是a2p
和s2p
用于将awk
脚本和sed
脚本转换为Perl。 Perl是下一代脚本语言中最早的一种(Tcl / Tk可能声称是首要的)。 它具有function强大的集成式正则expression式处理function,并且function更强大。 它提供对几乎所有系统调用的访问,并具有CPAN模块的可扩展性。 ( awk
和sed
都不是可扩展的。)Perl的一个格言是“TMTOWTDI – 有多种方法可以做到”(发音为“tim-toady”)。 Perl有“对象”,但它比语言的一个基本部分更像是一个附加组件。
Python是最后写的,可能部分是对Perl的反应。 它有一些有趣的语法想法(缩进表示级别 – 没有大括号或等价物)。 它比Perl更基本的面向对象; 它和Perl一样可扩展。
好的 – 什么时候使用每个?
- sed – 当你需要对文件进行简单的文本转换时。
- awk – 当你只需要简单的格式化和汇总或数据转换。
- perl – 几乎可以处理任何任务,但特别是当任务需要复杂的正则expression式时。
- python – 为您可以使用Perl的相同的任务。
我不知道Perl可以做什么,Python不能,反之亦然。 两者之间的select取决于其他因素。 在Python之前,我学习了Perl,所以我倾向于使用它。 Python的语法增长较less,学习起来通常比较简单。 当Perl 6变得可用的时候,将会是一个非常吸引人的发展。
(请注意,特别是对Perl和Python的“概览”是非常不完整的;整本书都可以写在这个主题上。
掌握几十种语言之后,你会厌倦像洛特(S. Lott)这样的人(见他对这个问题的有争议的回答,接近六年后,将近一半的反对票(+ 45 / -22))。
Sed是极其简单的命令行pipe道的最佳工具。 在sed master的手中,它适用于任意复杂度的一次性,但除了非常简单的replacestream水线之外,不应该用于生产代码。 东西像's / this / that /'。
当只有一个input源和一个输出(或者多个输出顺序写入)时,Gawk(GNU awk)是复杂数据重新格式化的最佳select。 由于大量的现实世界的工作符合这个描述,一个好的程序员可以在两个小时内学习gawk,所以这是最好的select。 在这个星球上,更简单,更快更好!
当你有非常复杂的input/输出场景时,Perl或者Python比任何awk或者sed版本都好得多。 问题越复杂,从维护和可读性的angular度来看,使用python越好。 但是请注意,一个好的程序员可以用任何语言编写可读的代码,坏的程序员可以用任何有用的语言编写难以维护的废话,所以如果程序员是程序员,那么perl或python的select可以安全地留给程序员的偏好熟练而聪明。
首先,在列表“Perl,Python awk和sed”中有两个不相关的东西。
事情1 – 简单的文本操作工具。
-
SED。 它具有一个固定的,相对简单的工作范围,即通过阅读和检查文件的每一行来定义。 sed的devise不是特别易读。 它被devise成非常小巧,非常小巧的unix服务器。
-
AWK。 它有一个稍微固定的,不那么简单的工作范围。 但是,awk程序的主循环是通过隐式读取源文件的行来定义的。
这些不是“完整”的编程语言。 尽pipe你可以用一些工作在awk中编写相当复杂的程序,但是它很快就会变得复杂而难以阅读。
事2 – 通用编程语言。 它们具有丰富多样的语句types,众多的内置数据结构,以及没有线路input的假设或捷径。
-
Perl的。
-
python。
何时使用它们。
-
SED。 决不。 内存超过32K的电脑在现代时代确实没有任何价值。 Perl或Python可以更清楚地完成相同的事情。
-
AWK。 决不。 像sed一样,它反映了早期的计算时代。 除了保持这种语言(除了成功的系统所需的所有其他语言之外),使用一种愉快的语言简单地完成所有的事情会更加愉快。
-
Perl的。 任何types的编程问题。 如果你喜欢自由思考的语法,那么有许多方法可以做同样的事情,Perl很有趣。
-
python。 任何types的编程问题。 如果你喜欢相当有限的语法,那里的selectless,微妙,(也许)更清晰。 Python的面向对象本质使它更适合于大型复杂的问题。
背景 – 我不是在无知中抨击sed和awk。 我在20年前学会了awk。 做了很多事情 用来教它作为核心unix技能。 大约15年前我学习了Perl。 用它做了许多复杂的事情。 因为我可以在Python中做同样的事情,所以我把它们都放在后面,而且更简单,更清晰。
sed和awk有两个严重的问题,都不是他们的年龄。
-
其实施的不完整性。 sed和awk所做的一切都可以用Python或Perl完成,通常更简单,有时也更快。 壳pipe道由于其多处理而具有一些性能优势。 Python提供了一个
subprocess
模块,可以让我恢复这些优势。 -
需要学习另一种语言。 通过在Python(或Perl)中执行,您的实现依赖于更less的语言,从而提高清晰度。
我不会把sed称为一种完全成熟的编程语言,它是一个带有语言结构的stream编辑器,旨在以编程方式编辑文本文件。
Awk更多的是一种通用语言,但它仍然最适合文本处理。
Perl和Python是完全成熟的通用编程语言。 Perl有其文本处理的根源,并且有许多类似于awk的构造(甚至在网上都有一个awk-to-perl脚本)。 Perl和Python之间有很多不同之处,最好的办法是在维基百科上阅读这两种语言的摘要,以便更好地理解它们是什么。
何时使用它们:awk – 从来不 – S. Lott。
我认为S.洛特在这个build议中略微错失了标志。 事实是,在Linux和其他UNIX环境中,awk是一个有用的工具,可以与bash,sh和ksh一起用于快速文本处理。 脚本本身的想法是通过粘贴这个工具来解决你的问题。 因此,在pipe理脚本中,通常有ls,grep,|,awk,time,ps等。每个工具都是脚本编写者像一个砖块一样一砖一瓦结合起来完成build筑(解决手头的问题) 。
比如我是pipe理彩弹齿轮用品networking团队的团队成员。 这个电子商务网站是基于LAMP堆栈。 为了将来自不同供应商的数据馈送自动化处理和标准化到后端数据库,我们采用并保持各种脚本组合,包括bash,perl,php,甚至期望。 每个人都有基于可用模块和API的优势。 在bash脚本中,我们使用awk快速模式匹配和适当的模式操作,而不需要切换到PERL。 我还想指出的一点是,这些脚本没有被强调,这些脚本是从购买者那里购买的,或者是从开源获得的。 如果脚本以Perl的forms出现,我们将其作为Perl来维护; 如果脚本以Php的forms出现,我们将其保留为Php; 如果它是bash的话,我们把它维持为bash; 我们不会用另一种语言重新编写它,只是因为我们认为它在原始语言中效率较低。