grepとawkの使用

grepとawkの使用

特定のパターンをキャプチャしてawk使用grepできます。なぜ私たちは他のものを使うべきですか?どちらが速く、その理由は何ですか?

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

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

または

grep 'pattern' /var/log/messages

ベンチマークをしたことがないのでよくわかりません。誰かがこれについて詳しく説明してもらえますか?両方のツールの内部の仕組みを知ることをお勧めします。

答え1

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つのコマンドを2回実行しました。)

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

Stephaneがコメントで正確に指摘したように、使用するgrepとawkの実装、オペレーティングシステム、および扱う文字セットによってマイルが変わる可能性があります。

答え2

利用可能な最も具体的で表現力豊かなツールを使用してください。あなたのユースケースに最適なツールはおそらく最速です。

おおよそのガイドラインは次のとおりです。

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

答え3

文字列のみを検索する場合は、ほとんど常に使用する必要があり、おおよその検索よりもはるかに高速です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

答え4

簡単に言えば、grep他の多くのUNIXツールと同様に、特定のパターンに行を一致させる1つのことを行い、これをうまく行います。一方、awkPOSIX標準によって定義された完全なプログラミング言語であり、パターン検索および処理のための変数、配列、式、関数、または制御ステートメントなどの一般的な機能を備えているため、より複雑なツールです。

私の意見では、パターンマッチング状況で両方のツールのパフォーマンスと処理したいいくつかの入力のサイズによって異なります。 grepは一致のみを実行するので、通常はawkよりも効率的であると期待します。ただし、他のツールを使用せずに一致レコードの追加処理、計算、または結果の印刷などのより複雑な操作を実行するために、grepを使用して単純なコードを書くことはできません。

関連情報