非常に大きなファイルに対して、次の2つのコマンドを実行しました。
grep -E 'string1|string2' 151103*.log|grep 'string3' | grep string4
awk '/string1|string2/ && /string3/ && /string4/' 151103*.log
実行時間はほぼ同じです。しかし、awk
一致する結果がより早く現れました。grep
また、同じ結果が表示されますが、最後に処理が完了します。
どちらのプロセスも同じ時間がかかり、検索とawk
その背後にあるロジックが気になりますgrep
。
なぜより速いのですawk
か?これら2つのプログラムは異なる検索ロジックを持っていますか?上記の検索で文字列を難読化すると、検索速度に影響しますか?
ベストアンサー1
GNUはgrep
出力をバッファリングしますが、GNUはawk
バッファリングしません。 GNUを使用せずにawk
他のバリアントを使用しても、端末に印刷するとまだラインバッファリングされているため、\n
ewlineの出力は発生するたびにフラッシュされますが、grep
パイプに書き込むとブロックされます。バッファが何であれ。 GNUがある場合は、これをgrep
使用grep --line-buffered ... | grep ...
して比較してできるだけ早く結果を確認できます。おそらく、grep
ほぼすべての競争テストawk
、特にGNUで勝つでしょうgrep
。
これsed
もあなたが望むことを行います:
sed -ne'/string4/{/string3/s/string[12]/&/p;}' <in >out