它们之间的主要区别是什么?在哪些典型场景中使用每种语言更好?
5 回答
按出现顺序,语言是sed
, awk
, perl
, python
.
该sed
程序是一个流编辑器,旨在将脚本中的操作应用于输入文件的每一行(或更一般地,应用于指定的行范围)。它的语言基于ed
Unix 编辑器,虽然它有条件等,但很难用于复杂的任务。你可以用它创造小奇迹——但要付出你头上的头发的代价。但是,在尝试其职权范围内的任务时,它可能是最快的程序。(它具有讨论的程序中最不强大的正则表达式 - 足以满足许多目的,但肯定不是 PCRE - Perl-Compatible Regular Expressions)
该awk
程序(名称来自其作者的首字母 - Aho、Weinberger 和 Kernighan)最初是用于格式化报告的工具。它可以用作增强剂sed
;在其最新版本中,它在计算上是完整的。它使用了一个有趣的想法——该程序基于“模式匹配”和“模式匹配时采取的操作”。这些模式相当强大(扩展正则表达式)。动作的语言与 C 类似。其主要特点之一awk
是它自动将输入拆分为记录,并将每条记录拆分为字段。
Perl 部分是作为 awk-killer 和 sed-killer 编写的。它提供的两个程序是a2p
和s2p
用于将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 的“概述”尤其是非常不完整;整本书都可以写在这个主题上。)
在掌握了几十种语言之后,你会厌倦像 S. Lott 这样的人(参见他对这个问题的有争议的回答,在回答六年后,反对票的数量几乎是赞成票(+45/-22)的一半)。
Sed 是极其简单的命令行管道的最佳工具。在 sed 大师手中,它适用于任意复杂的一次性,但它不应该用于生产代码,除非在非常简单的替换管道中。像's/this/that/.'这样的东西
当只有一个输入源和一个输出(或多个输出顺序写入)时,Gawk(GNU awk)是迄今为止复杂数据重新格式化的最佳选择。由于现实世界的大量工作都符合这个描述,而且一个好的程序员可以在两个小时内学会 gawk,它是最好的选择。在这个星球上,越简单越快越好!
当您有非常复杂的输入/输出场景时,Perl 或 Python 比任何版本的 awk 或 sed 都要好得多。从维护和可读性的角度来看,问题越复杂,使用 python 的效果就越好。但是请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写无法维护的废话,因此如果该程序员是熟练和聪明。
我不会将 sed 称为成熟的编程语言,它是一种流编辑器,具有旨在以编程方式编辑文本文件的语言结构。
awk 更像是一种通用语言,但它仍然最适合文本处理。
Perl 和 Python 是成熟的通用编程语言。Perl 起源于文本处理,并且有许多类似 awk 的结构(甚至网上流传着一个 awk-to-perl 脚本)。Perl 和 Python 之间有很多不同之处,最好的办法可能是在 Wikipedia 之类的网站上阅读这两种语言的摘要,以便更好地了解它们是什么。
首先,列表“Perl、Python awk 和 sed”中有两个不相关的东西。
事物 1 - 简单的文本操作工具。
赛德。它有一个固定的、相对简单的工作范围,由读取和检查文件的每一行的想法定义。sed 的设计并不是特别可读。它被设计为在非常小的 unix 服务器上非常小且非常高效。
哦。它的工作范围稍微不那么固定,也不那么简单。但是,awk 程序的主循环是通过隐式读取源文件的行来定义的。
这些不是“完整”的编程语言。虽然您可以通过一些工作在 awk 中编写相当复杂的程序,但它很快就会变得复杂且难以阅读。
事物 2 - 通用编程语言。它们具有丰富多样的语句类型、大量内置数据结构,并且没有内置的假设或捷径可言。
珀尔。
Python。
何时使用它们。
赛德。绝不。在内存超过 32K 的现代计算机时代,它确实没有任何价值。Perl 或 Python 更清楚地执行相同的操作。
哦。绝不。与 sed 一样,它反映了更早的计算时代。与其保持这种语言(除了成功系统所需的所有其他语言),不如用一种愉快的语言简单地做所有事情更愉快。
珀尔。任何类型的任何编程问题。如果你喜欢自由思考的语法,有很多很多方法可以做同样的事情,perl 很有趣。
Python。任何类型的任何编程问题。如果您喜欢相当有限的语法,选择更少,微妙之处更少,并且(也许)更清晰。Python 的面向对象特性使其更适合处理大型、复杂的问题。
背景——我并不是因为无知而抨击 sed 和 awk。我在 20 多年前学习了 awk。用它做了很多事情;曾经把它作为一项核心的unix技能来教授。大约 15 年前我学习了 Perl。用它做了很多复杂的事情。我把两者都抛在了后面,因为我可以在 Python 中做同样的事情——而且它更简单、更清晰。
sed 和 awk 有两个严重的问题,这两个问题都不是他们的年龄。
他们实施的不完整性。sed 和 awk 所做的一切都可以在 Python 或 Perl 中完成,通常更简单,有时也更快。由于它的多处理,shell 管道具有一些性能优势。Python 提供了一个
subprocess
模块来让我恢复这些优势。需要学习另一种语言。通过在 Python(或 Perl)中做事,您的实现依赖于更少的语言,从而提高了清晰度。
何时使用它们: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;