回答:
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の実装、使用しているオペレーティングシステム、および処理している文字セットによって、走行距離が異なる場合があります。
最も具体的で表現力豊かなツールを使用します。ユースケースに最適なツールは、おそらく最速です。
大まかなガイドとして:
perl
代わりに使用しますawk
。あなたはgrepを/カット/ sedのより複雑なものが必要な場合は、その後、チャンスはawkは十分ではありません、あなたは「本格的」なものを必要としている
文字列のみを検索し、速度が重要な場合は、ほとんど常に使用する必要がありますgrep
。awk
粗雑な検索の場合よりも桁違いに高速です。
ソース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
awk ... has PCRE matching for regular expressions
だけでなく、どちらが完全に間違っているかを示しています。
理論的にgrep
はawk
、実際には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で使用されていたもの)よりも高速になる可能性があります。
簡単に言えば、grep
他の多くのUNIXツールと同じように1つのことを実行するだけで、行を指定されたパターンに一致させることができます。一方、awk
POSIX標準で定義された完全なプログラミング言語であるため、パターンスキャンおよび処理用の変数、配列、式、関数、制御ステートメントなどの典型的な機能を備えた、より洗練されたツールです。
私の意見では、パターンマッチングの場合に両方のツールがどのように動作するか、および処理する入力のサイズに依存します。grepは、マッチングのみを行うため、通常awkよりも効率的であると予想されます。ただし、他のツールを使用せずに、一致したレコードの追加処理、計算、結果の印刷などのより複雑なタスクを実行する単純なコードをgrepで作成することはできません。
time
を実行するのにかかる時間を計るために、コマンドをシェルスクリプトも含めてコマンドの前に置きます。例:time ls -l
。