特定のパターンをキャプチャして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
文字列のみを検索する場合は、ほとんど常に使用する必要があり、おおよその検索よりもはるかに高速です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
答え4
簡単に言えば、grep
他の多くのUNIXツールと同様に、特定のパターンに行を一致させる1つのことを行い、これをうまく行います。一方、awk
POSIX標準によって定義された完全なプログラミング言語であり、パターン検索および処理のための変数、配列、式、関数、または制御ステートメントなどの一般的な機能を備えているため、より複雑なツールです。
私の意見では、パターンマッチング状況で両方のツールのパフォーマンスと処理したいいくつかの入力のサイズによって異なります。 grepは一致のみを実行するので、通常はawkよりも効率的であると期待します。ただし、他のツールを使用せずに一致レコードの追加処理、計算、または結果の印刷などのより複雑な操作を実行するために、grepを使用して単純なコードを書くことはできません。