web-dev-qa-db-ja.com

Perl、Python、AWK、sedの違いは何ですか?

それらの主な違いは何ですか?そして、各言語の力(使用するほうが良い場合)。

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

241

表示順では、言語はsedawkPerlpythonです。

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

awkプログラム(著者のイニシャル-Aho、Weinberger、およびKernighanからの名前)は、元々レポートをフォーマットするためのツールです。スープsed;として使用できます。最新バージョンでは、計算が完了しています。興味深いアイデアを使用しています-プログラムは「パターンが一致」と「パターンが一致したときに実行されるアクション」に基づいています。パターンはかなり強力です(拡張正規表現)。アクションの言語はCに似ています。awkの重要な機能の1つは、入力行をフィールドに自動的に分割することです。

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

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

OK-それぞれをいつ使用しますか?

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

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

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

529

数十の言語を習得した後、S。Lottのような人々にうんざりします(この質問に対する論争の的となる回答、回答から6年後のアップ(+ 45/-22)のほぼ半分の投票数を参照)。

Sedは、非常に単純なコマンドラインパイプラインに最適なツールです。 sedマスターの手で、任意の複雑さの1回限りの使用に適していますが、非常に単純な置換パイプラインを除き、実動コードでは使用しないでください。 「s/this/that /。」のようなもの

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

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

89
Charlie

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

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

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

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

これらは「完全な」プログラミング言語ではありません。 awkでかなり洗練されたプログラムを作成できますが(多少の作業は必要ですが)、すぐに複雑になり読みにくくなります。

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

  • Perl。

  • Python。

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

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

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

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

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

背景-私はセッドをバッシングせず、無知から目を覚ます。 20年以上前にawkを学びました。それで多くのことをしました。コアUNIXスキルとしてそれを教えるために使用されます。私は約15年前にPerlを学びました。それで多くの洗練されたものをしました。 Pythonで同じことができるので、両方を残しました。それはより単純で明確です。

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

  1. 実装の不完全さ。 sedとawkのすべては、PythonまたはPerlで実行できます。多くの場合、より単純で、時には高速です。シェルパイプラインには、そのマルチプロセッシングのためにパフォーマンス上の利点があります。 Pythonは、subprocessモジュールを提供して、これらの利点を回復できるようにします。

  2. さらに別の言語を学ぶ必要性。 Python(またはPerl)で処理を行うことで、実装に依存する言語が少なくなり、結果として明瞭さが向上します。

21
S.Lott

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

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

PerlとPythonは、本格的な汎用プログラミング言語です。 Perlのルーツはテキスト処理にあり、awkに似た構造が多数あります(ネット上にはawk-to-Perlスクリプトさえあります)。 PerlとPythonには多くの違いがあります。おそらく、Wikipediaのようなもので両方の言語の概要を読んで、それらが何であるかをよく理解することをお勧めします。

20
Robert Gamble

それらを使用する場合:awk-never-S. Lott。

私は、S。Lottがこの勧告でマークをわずかに逃したと思います。事実、Linuxや他のUNIX環境では、awkはbash、sh、kshで使用してテキストをすばやく処理するのに便利なツールです。スクリプト自体のアイデアは、このツール、そのツールを一緒に接着することで問題を解決することです。したがって、管理スクリプトでは、ls、grep、|、awk、time、psなどを使用するのが一般的です。それぞれは、スクリプターがビルダーをレンガのように組み合わせて建物を仕上げるツールです(手元の問題を解決するため) 。

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

12
tao quam