grepとawkの使用


17

特定のパターンをキャプチャするには、awkおよびgrep使用することができます。なぜ私たちは一方をもう一方の上に使うべきですか?どちらが速いですか、そしてなぜですか?

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

awk '/pattern/' /var/log/messages

または

grep 'pattern' /var/log/messages

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


コマンドtimeを実行するのにかかる時間を計るために、コマンドをシェルスクリプトも含めてコマンドの前に置きます。例:time ls -l
ブルラッシュ

回答:


26

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の実装、使用しているオペレーティングシステム、および処理している文字セットによって、走行距離が異なる場合があります。


2
どのgrepまたはawk実装を使用しているか、どのコンピューターアーキテクチャーで、どのシステム文字セットを使用しているかは言うまでもありませんが、これらのタイミングにはほとんど価値がありません。
ステファンシャゼル

1
2番目のコマンドも新しくキャッシュされたバージョンを使用します。grepの方が速いとは思いませんが、数字が示すほどではありません。
exussum

(したがって、awk、grep、awk、grepを実行し、awkとgrepの2番目のセットからの結果を投稿します:)およびFYI、UTF8ロケールに住んでいます。
Dravスローン

1
面白いことに、BSDツール(Mac)では、awk(31.74s)はsed(33.34s)よりわずかに速く、srep(33.34s)はgrep(34.21s)よりわずかに速いです。Gnu awkはすべて5.24でそれらを所有しています。テストするためのgnu grepもsedもありません。
ケビン

1
awkは、正規表現を検索するだけでなく、各入力行でより多くの処理を行うため、grepは少し速くなるはずです。たとえば、スクリプトでフィールドが参照される場合(この場合はそうではありません) field-separator値と組み込み変数を設定します。ただし、投稿した内容にほとんど違いはありません。これまででawkが特定のフィールドを検索し、これより高精度、より少ない誤った一致を提供することができながら、grepをとawkのWRTマッチング正規表現の最も重要な違い一致する文字列の場合とはgrepで検索全体のラインがあります。
エド・モートン

14

最も具体的で表現力豊かなツールを使用します。ユースケースに最適なツールは、おそらく最速です。

大まかなガイドとして:

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

+1のperl代わりに使用しますawk。あなたはgrepを/カット/ sedのより複雑なものが必要な場合は、その後、チャンスはawkは十分ではありません、あなたは「本格的」なものを必要としている
SDS

@sdsなぜないのpythonの代わりに
RetroCode

@RetroCode:pythonはperlよりも「汎用」です。同等のワンライナーはおそらくはるかに長くなります。
sds

3
@sdsいいえ、テキスト処理以外のことをしない限り、perlは必要ありません。awkは、grep / cut / sedよりも複雑で、perlとは異なり、すべてのUNIXインストールで標準としてボーナスとして提供されるテキスト処理のものに適しています。
エド・モートン

10

文字列のみを検索し、速度が重要な場合は、ほとんど常に使用する必要がありますgrepawk粗雑な検索の場合よりも桁違いに高速です。

ソース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

1
これらすべてのプログラムのこの素晴らしい概要をありがとう。それは本当に暗闇の中で光を放ちます。
holasz

1
〜headtilt〜PHPはありますが、Perlはありませんか?
イズカタ

@Izkata-少し前にこのテーブルを見たときに同じことを考えました。
slm

1
他のユーティリティにとって、grepが検索しているだけでなく、それらが置き換えられていることは、実際には公平ではありません。
ケビン

1
これらは完全に偽の数字です。リンゴとオレンジの比較について話す-5秒でウェブサイトAで新しい車しか見つけられないのに、1時間でサイトBで車を見つけ、価格を交渉し、融資を受け、車を購入できるしたがって、サイトAはサイトBよりも高速です。引用した記事は、grep、sed、awkの相対的な実行速度に関する記述が完全に間違っているawk ... has PCRE matching for regular expressionsだけでなく、どちらが完全に間違っているかを示しています。
エド・モートン

5

理論的にgrepawk、実際にはYMMV よりも高速でなければならないことに同意しますが、YMMVは使用する実装に大きく依存します。

ここでは、busybox 1.20.0のgrepとawk、GNU grep 2.14、mawk 1.3.3、Debian / Linux 7.0 amd64(glibc 2.17を使用)での2.5MB行の240MBファイルのUTF-8ロケールでの比較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 

Cロケールでは、GNU grepのみが大幅に向上し、より高速になりmawkます。

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

このデータセットのawk場合grep、busyboxベースのシステムやmawk、デフォルトawkでデフォルトのロケールがUTF-8ベースのシステム(IIRC、Ubuntuで使用されていたもの)よりも高速になる可能性があります。


2

簡単に言えば、grep他の多くのUNIXツールと同じように1つのことを実行するだけで、行を指定されたパターンに一致させることができます。一方、awkPOSIX標準で定義された完全なプログラミング言語であるため、パターンスキャンおよび処理用の変数、配列、式、関数、制御ステートメントなどの典型的な機能を備えた、より洗練されたツールです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.