web-dev-qa-db-ja.com

grepとawkの使用

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

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

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

または

grep 'pattern' /var/log/messages

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

17
holasz

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

26
Drav Sloan

最も具体的で表現力豊かなツールを使用してください。ユースケースに最適なツールが最も高速です。

大まかなガイドとして:

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

文字列のみを検索する場合、速度が重要な場合は、ほとんど常に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
11
slm

理論的にはgrepawkよりも高速であることに同意しますが、実際には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であるため、awkgrep -Eと比較する必要があります。

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

5

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

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

2
dsmsk80