特定のパターンをキャプチャするには、awk
およびgrep
を使用できます。なぜ一方を他方に使用する必要があるのですか?どちらが速く、なぜですか?
ログファイルがあり、特定のパターンを取得したい場合は、次のいずれかを実行できます
awk '/pattern/' /var/log/messages
または
grep 'pattern' /var/log/messages
ベンチマークをまだ行っていないので、わかりません。誰かがこれを詳しく説明できますか?これら2つのツールの内部動作を知っておくのは素晴らしいことです。
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
よりも桁違いに高速です。
ソース 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
理論的にはgrep
はawk
よりも高速であることに同意しますが、実際にはYMMVは使用する実装に大きく依存します。
ここでは、busybox 1.20.0のgrepとawkを比較していますGNU grep 2.14、mawk 1.3.3、GNU awk 4.0.1 on Debian/Linux 7.0 AMD64(with glibc 2.17)。ASCIIのみの文字の2.5M行の240MBファイルのUTF-8ロケール。
$ 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
よりも高速になります。
データセット、正規表現のタイプも大きな違いを生む可能性があります。正規表現の場合、awk
の正規表現は拡張REであるため、awk
はgrep -E
と比較する必要があります。
このデータセットの場合、awk
はbusyboxベースのシステムまたはgrep
がデフォルトmawk
でデフォルトロケールがUTF-8であるシステムではawk
よりも高速である可能性がありますベース(IIRC、Ubuntuの場合)。
簡単に言えば、grep
は他のUNIXツールと同じように1つのことだけを行い、それは行を指定されたパターンに一致させ、それをうまく実行します。一方、awk
はPOSIX標準で定義された完全なプログラミング言語であり、変数のスキャン、処理、変数、配列、式、関数、制御ステートメントなどの典型的な機能を備えているため、より洗練されたツールです。
私の意見では、パターンマッチングの場合に両方のツールが実行する実装と、処理する入力のサイズに依存します。 grepはマッチングのみを行うため、通常awkよりも効率的であると思います。しかし、grepを使用して単純なコードを記述し、他のツールを使用せずに、一致したレコードのさらなる処理、計算、結果の印刷などのより複雑なタスクを実行することはできません。