grep --binary-filesオプションの使い方|バイナリファイルも検索対象にできる便利機能
生徒
「grepってテキストを検索するコマンドですよね?でもバイナリファイルだと使えないって聞きました。」
先生
「そのとおり。grepは基本的にテキストファイル向けですが、--binary-filesオプションを使うとバイナリファイルに対する動作を制御できますよ。」
生徒
「バイナリファイルって何ですか?あと、どうやって使うんですか?」
先生
「いい質問ですね。まずはバイナリファイルの意味と、このオプションの使い方から見ていきましょう。」
1. grepとは?基本の使い方をおさらい
grep(グレップ)は、Linuxでテキストファイルから特定の文字列を検索するためのコマンドです。例えば、errorという単語をファイルの中から探すには、以下のようにします。
grep error log.txt
error: connection failed
error: file not found
このように、指定したキーワードを含む行だけを表示してくれる便利なコマンドです。
2. バイナリファイルとは何か?
バイナリファイルとは、人間が読むための文字だけでなく、機械が処理するためのデータ(画像・音声・プログラムなど)が含まれたファイルのことです。例えば、JPEG画像ファイルやPDFファイル、実行ファイルなどがバイナリファイルです。
grepは通常、こうしたバイナリファイルを読み込もうとすると、「バイナリファイルです」と判断して処理をスキップする場合があります。
3. grep --binary-filesオプションの役割
--binary-filesオプションは、grepがバイナリファイルをどう扱うかを指定するオプションです。主に以下の3つのモードがあります:
--binary-files=binary:バイナリとして扱い、マッチしても内容は表示せず、通知だけ行う。--binary-files=text:バイナリでもテキストファイルとして扱う。出力もされる。--binary-files=without-match:マッチしないとして扱う。つまり完全スキップ。
デフォルトではbinaryです。つまりgrepは通常、バイナリファイル内で検索結果が見つかっても、「Binary file x matches」のような一文しか表示しません。
4. --binary-files=textでバイナリファイルから文字列を抽出する
PDFやログの一部がバイナリ形式だった場合、通常のgrepでは内容が見られないことがあります。そこで--binary-files=textを使えば、バイナリファイルでも中身を検索・表示できます。
grep --binary-files=text "error" report.pdf
error: failed to load image
error: invalid byte sequence
このように、ファイルがバイナリ扱いであっても、textとして処理すれば検索結果をしっかり表示できます。ただし文字コードが不正だったり、ファイルが完全にバイナリの場合は意味不明な文字列になることもあります。
5. --binary-files=without-matchで完全に無視する
もし「バイナリファイルは検索対象にしたくない」という場合は、--binary-files=without-matchを使えば、そのファイルは無視されるようになります。
grep --binary-files=without-match "error" *
(※バイナリファイルはスキップされ、テキストのみ結果が出る)
6. --binary-filesオプションと--exclude/--includeの併用
検索対象のファイルを限定する--includeや--excludeと組み合わせることで、より柔軟な検索が可能になります。
grep --binary-files=text --include="*.log" "ERROR" *
ERROR: system crashed
ERROR: unknown input
このようにして、拡張子が.logのファイルだけを対象にしつつ、バイナリファイルもテキストとして処理できるのです。
7. バイナリと誤判定されたテキストファイルにも使える
ファイルの中には、文字コードや改行コードの関係で、本当はテキストなのにバイナリと誤判定されることがあります。そういったときも、--binary-files=textを使うことで、内容を正常に検索できます。
たとえば、WindowsからコピーしたCSVファイルがバイナリ判定されてしまうケースなどが該当します。
8. 他のgrep関連オプションと組み合わせて使おう
--binary-filesは、他のgrepオプションとも相性が良いです。例えば、-rで再帰的に検索しつつ、バイナリファイルの扱いをコントロールできます。
grep -r --binary-files=text "password" /var/log
password expired
password reset required
ログディレクトリやシステム設定を調べるときに、意外とバイナリファイルが混ざっていることがあるので、うまく使い分けましょう。