Perl、Python、AWK、sedの違いは何ですか?[閉まっている]


253

それらの間の主な違いは何ですか知りたいですか?各言語の能力(使用する方がよい場合)。

編集:それは「対」ではありません。トピックのように、単なる情報。


142
これらのタイプのいわゆる非建設的な質問は本当に役に立ちます。
Steam

10
確かに、フロントページのタブを見つけると便利です...

コマンドラインでのpythonの有用性について、PYPを参照してください
ニール・マクギガン

回答:


550

外観のためには、言語はsedawkperlpython

sedプログラムは、入力ファイルまたはファイルのストリームエディタで、(行の指定した範囲に、より一般的に、)各ラインにスクリプトからアクションを適用するように設計されています。その言語はedUnixエディターであるに基づいており、条件付きなどがありますが、複雑なタスクを処理するのは困難です。あなたはそれでマイナーな奇跡を働かせることができます-しかしあなたの頭の髪の代償を払って。ただし、その権限内でタスクを試行する場合は、おそらくプログラムの中で最速です。(それは議論されたプログラムの最も強力でない正規表現を持っています-多くの目的には十分ですが、確かにPCREではありません-Perl互換の正規表現)

awkプログラム(その作者の頭文字から名前-アホ、ワインバーガー、とカーニハン)は、レポートの書式設定のため、当初のツールです。スープとして使用できますsed。最近のバージョンでは、計算的に完全です。これは興味深いアイデアを使用しています。プログラムは「パターンが一致した」と「パターンが一致したときに実行されたアクション」に基づいています。パターンはかなり強力です(拡張正規表現)。アクションの言語はCに似ています。の主要な機能の1つはawk、入力を自動的にレコードに分割し、各レコードをフィールドに分割することです。

Perlの一部はawk-killerおよびsed-killerとして作成されました。それに付属しているプログラムの二つがあるa2ps2p変換するためのawkスクリプトとsedのPerlにスクリプトを。Perlは次世代のスクリプト言語の最も初期の1つです(Tcl / Tkはおそらく優位性を主張できます)。非常に強力な言語による強力な統合正規表現処理を備えています。ほとんどすべてのシステムコールへのアクセスを提供し、CPANモジュールの拡張性があります。(どちらawksed拡張可能ではありません。)Perlのモットーの1つは「TMTOWTDI-これを行う方法は複数あります」(「tim-toady」と発音)。Perlには「オブジェクト」がありますが、これは言語の基本的な部分というよりはアドオンです。

Pythonは最後に作成されましたが、おそらくPerlへの反応として一部作成されました。興味深い構文のアイデアがあります(レベルを示すためにインデント-中括弧や同等のものはありません)。Perlよりも基本的にオブジェクト指向です。Perlと同じように拡張可能です。

OK-それぞれをいつ使うべきですか?

  • Sed-ファイルに対して単純なテキスト変換を行う必要がある場合。
  • Awk-単純なフォーマットとデータの要約または変換のみが必要な場合。
  • Perl-ほとんどすべてのタスク用ですが、特にタスクが複雑な正規表現を必要とする場合。
  • Python-Perlを使用できるのと同じタスク用。

私は、Pythonができないこと、またはその逆のことをPerlができることは何も知りません。2つの間の選択は、他の要因に依存します。Pythonが登場する前にPerlを学んだので、私はそれを使用する傾向があります。Pythonの方が構文が複雑でなく、一般に学習がやや簡単です。Perl 6が利用可能になると、魅力的な開発になるでしょう。

(特に、PerlとPythonの「概要」はひどく不完全であることに注意してください。このトピックについて本全体を書くことができます。)


82
A ++++投稿、もう一度読んでみよう!
Robert Gamble

24
特に「それぞれをいつ使用するか」の部分
Khaled Al Hourani 2008

6
pythonのzenは基本的にTMTOWTDIの正反対であり、perlに対する反応であると言えるでしょう。iirc TCLはperlの少し後の段階で、perlに対してかなり反応しますが、TCLの反応は構文と言語の複雑さであり、物事を行う方法ではありません
jk。

7
当初の意図が何であれ、後のPython開発とPythonコミュニティは、Perlのより柔軟で簡潔な構文よりも可読性と一貫性を優先していることは明らかです。優秀なポストジョナサン
マーティンベケット2010年

4
@blasto:ETLの場合、私は学習よりも優先awksedます(両方ともまだ用途があります)。タスクのサイズに関してsedは、行から行へのストレージがなく、一度に1行を処理するときに最高です。 awk多くの場合、すべてのソースから蓄積されたデータを使用して連想配列を構築するために使用されます。より多くのメモリを使用するため、大きなデータセットで問題が発生する可能性がはるかに高くなりsedます。tsawkあなたがそれにリンクする前に、私は聞いたことがありません。私は、Perlに頼る傾向があります(ただし、Pythonの方が使いやすいかもしれません)awk
ジョナサンレフラー

91

数十の言語を習得した後、S。ロットのような人々に飽きてきます(この質問に対する彼の論争の的となる回答を参照してください。回答から6年後には、投票数の半分近く(+ 45 / -22)です)。

Sedは、非常にシンプルなコマンドラインパイプラインに最適なツールです。sedマスターの手で、それは任意の複雑さの一時的なものに適していますが、非常に単純な置換パイプラインを除いて、製品コードでは使用しないでください。「s / this / that /」のようなもの。

Gawk(GNU awk)は、単一の入力ソースと単一の出力(または複数の出力が順次書き込まれる)しかない場合に、複雑なデータの再フォーマットに最適です。実際の作業の多くはこの説明に準拠しており、優れたプログラマーは2時間でgawkを学ぶことができるため、これが最良の選択です。この惑星では、シンプルで高速なほうがいいです。

PerlまたはPythonは、非常に複雑な入出力シナリオがある場合、どのバージョンのawkまたはsedよりもはるかに優れています。問題が複雑であるほど、メンテナンスと読みやすさの観点から、Pythonを使用するほうがよいでしょう。ただし、優れたプログラマーは読み取り可能なコードを任意の言語で記述でき、悪いプログラマーは保守不可能ながらくたを任意の有用な言語で記述できるため、perlまたはpythonの選択はプログラマーの設定に任せることができます。熟練して賢い。


9
100%同意。すべてではないにしても、ほとんどのツールを知り、それぞれをいつ使用するかが、優れた技術者と平凡な技術者を区別するものです。
ata

6
awkの代わりにPythonまたはPerlを選択するもう1つの理由は、変換要件に、別の言語に既存の堅牢なモジュールがある複雑な検証またはロジックが含まれる場合です。たとえばawkで電子メールや住所を適切に処理するために何が必要かを考えてみれば、私が何を意味するかがわかります。perlとpythonには、このようなことを簡単にするライブラリがあります。
sorpigal

3
実際、PerlはSedとAwkの両方を含むように設計されていました。SedやAwkを学ぶよりも、Perlで書く方が簡単だと思います。
Brad Gilbert

@BradGilbert:上の回答で述べたように、awkに対するPerl(&Python、rubyなど)の警告は、前者ではある種の正規表現がreaaaaaaaaaally遅くなることです:swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac 2016

1
@OlivierDulacはい、病理学的症例を示しています。からa?ⁿaⁿに変更した場合、1,000,000のa??ⁿaⁿPerl 5でそれを実行すると、2秒未満で実行されます。time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'素朴なものを実行すると、わずか25 秒間で2秒以上かかります。Perlには、一致するものを変更する正規表現内にPerlコードを含めることができるなど、より高速な機能よりも多くの正規表現機能があることを認識してください。必要に応じて、組み込みのものを他のものと交換するモジュールを実装できます。
Brad Gilbert

21

sedを本格的なプログラミング言語とは呼びません。これは、テキストファイルをプログラムで編集することを目的とした言語構造を持つストリームエディターです。

Awkはもう少し汎用言語ですが、それでもテキスト処理に最適です。

PerlとPythonは、本格的な汎用プログラミング言語です。Perlはテキスト処理にルーツを持ち、多くのawkに似た構成体を持っています(ネット上に浮かんでいるawk-to-perlスクリプトさえあります)。PerlとPythonの間には多くの違いがあります。おそらく、ウィキペディアのようなもので両方の言語の要約を読んで、それらが何であるかをよく理解することです。


2
私は倉庫番のsed実装を見てきました。これはチューリング完全性を意味します。ただし、sendmail.cfとTeXについても同様です。
ConcernedOfTunbridgeWells

7
かつてPostScriptを書いた人と協力して、レーザープリンターをルーターに変えました。
Sam Kington

10
@サム:すごい!プリンターのレーザーが木を切るのに十分な速度で作動することを知りませんでした!ああ、申し訳ありませんが、ルーターの種類が間違っています。
追って通知があるまで一時停止。

2
本格的な言語ではなく、sed?まあ、それは完全には真実ではありません、
なぜなら

1
awkで第4言語の実装を見てきました。(awkはそれ自体がパーサーと見なすことができるため、インタープリターをawkに実装するのはかなり簡単です)。
Tatjana Heuser 2014年

19

まず、「Perl、Python awk、sed」のリストには関係のないものが2つあります。

事1-単純なテキスト操作ツール。

  • セド。これには、ファイルの各行を読み取って調べるという考えによって定義された、比較的単純な固定の作業範囲があります。sedは特に読みやすいようには設計されていません。それは非常に小さなUNIXサーバー上で非常に小さく、非常に効率的になるように設計されています。

  • awk。作業範囲がやや固定的で単純ではありません。ただし、awkプログラムのメインループは、ソースファイルの行の暗黙的な読み取りによって定義されます。

これらは「完全な」プログラミング言語ではありません。awkでかなり洗練されたプログラムを書くこともできますが、複雑になって読みにくくなります。

Thing 2-汎用プログラミング言語。これらには、さまざまな種類のステートメント、多数の組み込みデータ構造があり、ワイヤードインの仮定や、話すショートカットはありません。

  • Perl。

  • Python。

それらをいつ使用するか。

  • セド。決して。32Kを超えるメモリを搭載した現代のコンピュータでは、これはまったく価値がありません。PerlまたはPythonは同じことをより明確に行います。

  • awk。決して。sedと同様に、それはコンピューティングの初期の時代を反映しています。(成功するシステムに必要な他のすべてに加えて)この言語を維持するのではなく、単純にすべてを1つの快適な言語で行うほうが楽しいです。

  • Perl。あらゆる種類のプログラミング問題。同じことをする方法がたくさんある、自由に考えられる構文が好きなら、perlは楽しいです。

  • Python。あらゆる種類のプログラミング問題。かなり限定された構文が好きで、選択肢が少なく、微妙さが少なく、(おそらく)より明確である場合。Pythonのオブジェクト指向の性質により、Pythonは大きくて複雑な問題により適しています。

背景-私はsedを打ちのめしたり、無知から気を悪くしたりしていません。20年以上前にawkを学びました。それで多くのことをしました。コアUNIXスキルとしてそれを教えるために使用されます。私は約15年前にPerlを学びました。それで多くの洗練された事をしました。Pythonで同じことができるので、両方とも置き忘れました-そして、それはよりシンプルでより明確です。

sedとawkには2つの深刻な問題があり、どちらも年齢ではありません。

  1. それらの実装の不完全さ。sedやawkが行うことはすべて、PythonまたはPerlで行うことができます。シェルパイプラインは、そのマルチプロセッシングのため、いくつかのパフォーマンス上の利点があります。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
私のシェルスクリプトの半分は、sedまたはawkを使用しています。彼らは死んでいません。私の好きなスクリプト言語はPythonですが、sedやawkがこの仕事に最適なツールになることもあります。それらが長年使用されているからといって、それらが時代遅れであるという意味ではありません。
ジェレミー・カントレル

16
@ S.Lott:私は誰もがawkでウェブアプリを構築しようとすることを提案しているわけではありませんが、それらを決して使用すべきではないと言うのは少しとんでもないことです。単純なs&rおよび/または微調整(特に区切られたテキストファイル)の場合、perl -eまたはpython -cはsed / awkワンライナーほど効率的ではありません。
RET

25
このような答えは好きではありません。sedとawkは数時間で理解しやすく、本格的な言語よりもはるかに軽量で広く利用できます。シェルプログラミングはこれまでと同じように関連性があり、「これは絶対に使用しないでください」またはそのツールは単に遅延されます。しかし、この遅れたアイデアは、Perlが登場した基盤の1つではありませんでしたか?まあ
ata

14

それらをいつ使用するか:awk-決して-S. Lott。

S. Lottは、この推奨事項でわずかに足りなかったと思います。Linuxと他のUNIX環境では、awkはbash、sh、kshと一緒に使用してテキストをすばやく処理できる便利なツールです。スクリプト自体のアイデアは、このツール、そのツールを一緒に接着することで問題を解決することです。したがって、管理スクリプトでは、ls、grep、|、awk、time、psなどを使用するのが一般的です。それぞれが、スクリプトを作成者がレンガごとに組み合わせて、建物を完成させる(手元の問題を解決する)ツールです。 。

たとえば、私はペイントボールのギア用品を管理するチームのチームメンバーです。dotcom。このeコマースサイトは、LAMPスタックに基づいています。さまざまなサプライヤーからのバックエンドデータベースへのデータフィードの自動処理と正規化のために、bash、perl、php、expectなどの多様なスクリプトの組み合わせを採用および維持しています。それぞれに、使用可能なモジュールとAPIに基づいた長所があります。bashスクリプトでは、PERLに切り替える必要なく、awkを使用して、必要に応じてパターンのクイックマッチングとパターンに対する適切なアクションを実行します。私が指摘したいことの1つは、スレッドでは強調されていませんが、これらのスクリプトのかなりの数が購入されたか、オープンソースから取得されたことです。スクリプトがPerlとして提供された場合は、Perlとして維持します。スクリプトがPhpとして提供された場合、Phpとして維持します。bashとして来た場合は、bashとして維持します。


7
ブライアン・ド・フォイではなく、あなたが引用したその回答を書いたのはS.Lottでした...
plusplus

5
このかなり古い回答の補足として:の出力を決して解析せlsず、代わりにglobを使用してください。これを読む。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.