Linuxで grep
コマンドを使って文字列検索をしていると、意図せず
Binary file (標準入力) matches
や
Binary file hoge.log matches
といった出力に遭遇することがあります。これは単純に「検索対象のファイルがバイナリファイルとして扱われた」ことを意味します。テキストを探しているつもりでも、grepが「このファイルはバイナリ」と判断するとこう表示されます。
あわせて読みたい


【コマンド詳細】grepの使い方とオプションまとめ
Linuxのgrepコマンドについて grepコマンドは、テキストファイルや標準出力から特定のパターンを検索するためのコマンドです。大量のログファイルから特定の文字列を抽…
あわせて読みたい


【コマンド詳細】拡張表現grep -Eの使い方とオプションまとめ
grepの拡張正規表現オプション(-Eオプション) GNUバージョンのgrepでは、通常の基本正規表現に加えて、拡張正規表現を使用することができます。拡張正規表現は複雑な…
目次
原因
- 改行コードや制御文字を含むファイル
- 例えばログファイルが壊れている場合や、UTF-16/Shift-JIS などで保存されている場合に grep がバイナリと誤判定することがあります。
- grep の仕様
- GNU grep は、検索対象に「非表示制御文字」を一定以上含むと、そのファイルをバイナリ扱いにします。
- そのため、完全にテキストファイルでも文字コードによっては弾かれることがあります。
解決方法
1. バイナリ判定を無視してテキストとして扱う
grep -a "検索文字列" ファイル名
-a
または--text
を付けると、ファイルを強制的にテキスト扱いで検索できます。
2. 出力を制御する(マッチ部分を表示する)
grep -a -n "検索文字列" ファイル名
-n
を付ければ行番号も表示でき、どこに含まれているか確認できます。
3. 文字コードを変換してから検索する
UTF-16 や Shift-JIS の場合は iconv
で UTF-8 に変換するとよいです。
iconv -f UTF-16 -t UTF-8 ファイル名 | grep "検索文字列"
4. どうしても扱えない場合
strings
コマンドで可視化してから grep に渡す方法も有効です。
strings ファイル名 | grep "検索文字列"
まとめ
grep: binary file matches
は「バイナリと判断された」というメッセージであり、エラーではありません。- 解決には
grep -a
で強制的にテキスト扱いするiconv
で文字コードを変換するstrings
でバイナリから文字列を抽出する
といった方法を使うのが一般的です。