初めに #
Linux にてログファイルやソースコードを検索する際によく使われるのが grep コマンドです。
指定した文字列を素早く検索できるため、日常的な運用作業からトラブルシューティングまで、幅広い場面で活用されています。
しかし、ディレクトリ全体を再帰的に検索する場合などでは、意図せずバイナリファイルまで検索対象に含まれてしまうことがあります。
その結果、検索に余計な時間がかかり、必要な情報へたどり着くまでの効率が下がってしまいます。
「grep でバイナリファイルを除外する方法」を理解しておくことで、検索効率を大きく向上させることができます。
本記事では、AlmaLinux環境を例に、バイナリファイルを除外してより効率的に検索を行う方法を紹介します。
grep でバイナリファイルを除外する方法 #
grep コマンドでは、オプションを指定することでバイナリファイルを検索対象から除外することができます。
最も簡単でよく使われるのが -I オプションです。
-I は --binary-files=without-match オプションの短縮指定となっております。
機能としてはどちらも同じ動作をしますが、基本的には入力しやすい短縮オプションを使用すれば問題ありません。
実際の指定方法は以下の通りとなっております。
grep -rI '検索文字列' 対象ディレクトリ
-I オプションを指定することで、バイナリファイルを「一致しないもの」として扱い、テキストファイルのみを対象とした検索が可能となります。
実際の比較例 #
ここでは、-I オプションを付けた場合と付けない場合の違いを比較します。
-I オプションを指定せずに再帰検索を行った場合、grep コマンドはバイナリファイルも検索対象に含まれます。
そのため、バイナリファイル内に検索文字列が含まれている場合、grep コマンドは次のようなメッセージを出力します。
バイナリファイル <ファイル名> に一致しました
例えば、error という文字列を検索した場合は、次のような結果になります。
$ grep -r 'error' .
./sample.txt:this is error message
バイナリファイル ./binary.bin に一致しました
一方、-I オプションを指定した場合は、バイナリファイルは「一致しないもの」として扱われるため、出力には表示されません。
以下は先ほどと同条件にて検索をした場合の出力例となります。
$ grep -rI 'error' .
./sample.txt:this is error message
このように、-I を付けるだけで検索結果がすっきりし、不要な出力を防ぐことができます。
ログ解析やソースコード検索など、テキストファイルのみを対象とする場合は、-rI をセットで使用するのがおすすめとなります。
バイナリをテキストとして検索する方法 #
ここまで紹介した -I は、バイナリファイルを「一致しないもの」として扱い、検索対象から除外するオプションでした。
しかし、状況によってはあえてバイナリファイルの中身を検索したい場合もあります。
そのような場合に使用するのが -a オプションです。
-a は、バイナリファイルをテキストとして扱い、内容をそのまま検索対象に含めるオプションとなっています。
grep -ra '検索文字列' 対象ディレクトリ
ただし、バイナリファイルは本来テキストではないため、出力結果が文字化けしたり制御文字が含まれたりする場合があります。
このような状況が発生した場合は、ターミナルで reset と入力してエンターキーを押すことで、表示を正常に戻すことができます。
まとめ #
再帰検索を行う際は、検索対象を適切に制御することが重要です。
grep でバイナリファイルを除外したい場合は -I オプションを活用することで、不要な出力を防ぎ、より効率的な検索が可能になります。
日常的なログ解析やソースコード検索では、-rI を基本として活用してみてください。
関連記事 #
インフラ技術部では grep コマンドで AND 検索 や OR 検索 を行う方法についても解説しています。
検索条件を組み合わせてより高度な検索を行いたい場合は、こちらもあわせてご覧ください。
コピペで使える!grepコマンドで複数条件の検索を行う方法(AND検索・OR検索)