grep: binary file matchesと表示される原因と解決方法

  • URLをコピーしました!

Linuxで grep コマンドを使って文字列検索をしていると、意図せず

Binary file (標準入力) matches

Binary file hoge.log matches

といった出力に遭遇することがあります。これは単純に「検索対象のファイルがバイナリファイルとして扱われた」ことを意味します。テキストを探しているつもりでも、grepが「このファイルはバイナリ」と判断するとこう表示されます。

目次

原因

  1. 改行コードや制御文字を含むファイル
    • 例えばログファイルが壊れている場合や、UTF-16/Shift-JIS などで保存されている場合に grep がバイナリと誤判定することがあります。
  2. 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 でバイナリから文字列を抽出する
      といった方法を使うのが一般的です。
目次