特定のパターンをキャプチャするには、awkおよびgrepを使用できます。なぜ一方を他方の上に使用する必要があるのですか?どちらが速いのか、そしてその理由は?

ログファイルがあり、特定のパターンを取得したい場合は、次のいずれかを実行できます

awk "/pattern/" /var/log/messages 

または

grep "pattern" /var/log/messages 

ベンチマークを行ったことがないので、わかりません。誰かがこれを詳しく説明できますか?これら2つのツールの内部動作を知ることは素晴らしいことです。

コメント

  • timeコマンドを使用して、コマンドの実行にかかる時間を計測します。例:time ls -l

回答

grepが最も可能性が高いより高速に:

# time awk "/USAGE/" imapd.log.1 | wc -l 73832 real 0m2.756s user 0m2.740s sys 0m0.020s # time grep "USAGE" imapd.log.1 | wc -l 73832 real 0m0.110s user 0m0.100s sys 0m0.030s 

awkは解釈されたプログラミング言語ですが、grepはコンパイルされたcコードプログラムです(ファイル内のパターンを見つけるためにさらに最適化されています) 。

(注-キャッシュによって結果が歪まないように、両方のコマンドを2回実行しました)

の解釈言語の詳細ウィキペディアで。

Stephaneがコメントで正しく指摘しているように、使用するgrepとawkの実装、使用しているオペレーティングシステム、設定されている文字によって、マイレージが異なる場合があります。

コメント

  • 使用しているgrepまたはawkの実装を言わずに'どのコンピュータアーキテクチャ、どのシステム文字セットを使用しても、これらのタイミングにはほとんど価値がありません。
  • 2番目のコマンドも新しく使用されますキャッシュされたバージョン。 grepの方が速いことは間違いありませんが、数値が示すほどではありません。
  • (したがって、awk、grep、awk、grepを実行し、awkとgrepの2番目のセットの結果を投稿します:)およびFYI 、私はUTF8ロケールに住んでいます。
  • おかしなことに、BSDツール(Mac)では、awk(31.74s)はsed(33.34s)よりもわずかに高速で、grep( 34.21s)。 Gnuawkは5.24秒でそれらをすべて所有しています。'テストするgnugrepまたはsedはありません。
  • awkはそれぞれでより多くのことを行うため、grepはわずかに高速になるはずです。入力行は、その中の正規表現を検索するだけではありません。スクリプトでフィールドが参照されている場合(この場合は'ではありません)、awkは各入力行をフィールド区切り文字の値に基づいてフィールドに分割し、組み込み変数に入力します。しかし、あなたが投稿したものとほとんど違いはないはずです。 grepとawkWrtの一致する正規表現の 最も重要な違いは、grepが行全体で一致する文字列を検索するのに対し、awkは特定のフィールドを検索できるため、精度が向上し、誤一致が少なくなることです。

回答

最も具体的で表現力豊かなツールを使用します。ユースケースに最適なツールが最速である可能性があります。

大まかなガイドとして:

  • 部分文字列または正規表現に一致する行を検索しますか? grepを使用します。
  • 単純に区切られたファイルから特定の列を選択しますか?カットを使用します。
  • パターンベースの置換を実行するか、… sedが合理的に実行できる他の処理を実行しますか? sedを使用します。
  • 上記の3つ、printfフォーマット、または汎用ループとブランチの組み合わせが必要ですか? awkを使用します。

コメント

  • +1(ivの代わりにperlを使用する場合を除く) id = “e077497fba”>

。 grep / cut / sedよりも複雑なものが必要な場合は、'十分ではなく、"完全なものが必要になる可能性があります。 -blown "

  • @sds代わりにpythonを使用しない理由
  • @RetroCode:pythonはもっと"一般的な目的"よりperl;同等のワンライナーはおそらくはるかに長くなります。
  • @sdsいいえ、' 'テキスト処理以外のことをします。 awkは、'がgrep / cut / sedよりも複雑で、perlとは異なり、すべてのUNIXインストールに標準で付属しているテキスト処理に適しています。
  • 回答

    文字列のみを検索し、速度が重要な場合は、ほとんどの場合grep。グロス検索に関しては、awkよりも桁違いに高速です。

    source sed、awk、その他のUnix解析ユーティリティの機能とパフォーマンスの違い

    UTILITY OPERATION TYPE EXECUTION TIME CHARACTERS PROCESSED PER SECOND (10 ITERATIONS) ------- -------------- --------------- ------------------------------- grep search only 41 sec. 489.3 million sed search & replace 4 min. 4 sec. 82.1 million awk search & replace 4 min. 46 sec. 69.8 million Python search & replace 4 min. 50 sec. 69.0 million PHP search & replace 15 min. 44 sec. 21.2 million 

    コメント

    • これらすべてのプログラムのこの素晴らしい概要に感謝します。それは本当に暗闇の中で光を放ちます。
    • 〜headtilt〜PHPはそこにありますが、Perlはありません' t?
    • どのgrepとどのawkを参照していますか?
    • それ' grepが検索している他のユーティリティに対しては実際には公平ではなく、それらも置き換えられています。
    • これらは完全に偽の数値です。リンゴとオレンジの比較について話します-'は、ウェブサイトAで5秒以内に新しい車をしか見つけることができないと言っているようなものですが、車は見つけることができます、価格を交渉し、ローンを取得し、サイトBで1時間で車を購入するため、サイトAはサイトBよりも高速です。引用した記事は完全に間違っています' s grep、sed、awk間の相対的な実行速度のステートメントであり、awk ... has PCRE matching for regular expressionsと書かれていますがこれは完全に真実ではありません。

    回答

    理論的には、grepawkよりも高速である必要があることに同意します。 、実際には、YMMVは使用する実装に大きく依存します。

    ここでは、busybox 1.20.0のgrepとawk、GNU grep 2.14、mawk 1.3.3、GNU awk4.0.1を比較しています。 Debian / Linux 7.0 amd64(glibc 2.17を使用)、UTF-8ロケール、240MBファイルの250万行のASCIIのみの文字。

    $ time busybox grep error error | wc -l 331003 busybox grep error error 8.31s user 0.12s system 99% cpu 8.450 total wc -l 0.07s user 0.11s system 2% cpu 8.448 total $ time busybox awk /error/ error | wc -l 331003 busybox awk /error/ error 2.39s user 0.84s system 98% cpu 3.265 total wc -l 0.12s user 1.23s system 41% cpu 3.264 total $ time grep error error | wc -l 331003 grep error error 0.80s user 0.10s system 99% cpu 0.914 total wc -l 0.00s user 0.11s system 12% cpu 0.913 total $ time mawk /error/ error | wc -l 330803 mawk /error/ error 0.54s user 0.13s system 91% cpu 0.732 total wc -l 0.03s user 0.08s system 14% cpu 0.731 total $ time gawk /error/ error | wc -l 331003 gawk /error/ error 1.37s user 0.12s system 99% cpu 1.494 total wc -l 0.04s user 0.07s system 7% cpu 1.492 total $ time 

    In Cロケールでは、GNU grepのみが大幅にブーストされ、mawkよりも高速になります。

    データセット、正規表現のタイプも大きな違いを生む可能性があります。正規表現の場合、awkの正規表現は拡張REであるため、awkgrep -Eと比較する必要があります。 。

    このデータセットの場合、busyboxベースのシステムまたはiv idのシステムでは、awkgrepよりも高速である可能性があります。 = “9adf7e2c4e”>

    はデフォルトのawkであり、デフォルトのロケールはUTF-8ベースです(IIRC、以前はUbuntuの場合でした)。

    回答

    簡単に言うと、grepは、他の多くのUNIXツールと同じように1つのことを実行します。与えられたパターンに線を一致させ、それはうまくいきます。一方、awkは、POSIX標準で定義された完全なプログラミング言語であり、変数、配列、式、関数、パターンスキャン用の制御ステートメントなどの一般的な機能を備えているため、より洗練されたツールです。処理。

    私の意見では、パターンマッチングの場合に両方のツールがどのように機能するか、および処理する入力のサイズによって異なります。 grepは、マッチングのみを行うため、通常はawkよりも効率的であると思います。ただし、他のツールを使用せずに、一致したレコードのさらなる処理、計算、結果の印刷など、より複雑なタスクを実行するための単純なコードをgrepで記述することはできません。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です