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


Linuxトラブルシューティング完全ガイド|症状別チェックリストと原因・対処の総まとめ
Linux障害対応で最も重要なのは、「症状を正しく切り分け、確認順を固定すること」です。 本記事は、実務でよくある障害パターンを症状別のチェックリストとして整理し…
目次
原因
- 改行コードや制御文字を含むファイル
- 例えばログファイルが壊れている場合や、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コマンドの使い方まとめ|よく使う例・オプション・正規表現まで解説
Linuxのgrepコマンドについて grepコマンドは、テキストファイルや標準出力から特定のパターンを検索するためのコマンドです。大量のログファイルから特定の文字列を抽…
あわせて読みたい


【コマンド詳細】拡張表現grep -Eの使い方とオプションまとめ
grepの拡張正規表現オプション(-Eオプション) GNUバージョンのgrepでは、通常の基本正規表現に加えて、拡張正規表現を使用することができます。拡張正規表現は複雑な…
まとめ
grep: binary file matchesは「バイナリと判断された」というメッセージであり、エラーではありません。- 解決には
grep -aで強制的にテキスト扱いするiconvで文字コードを変換するstringsでバイナリから文字列を抽出する
といった方法を使うのが一般的です。
あわせて読みたい


Linux学習ロードマップ完全版|初心者から現場レベルまでの勉強手順とコマンド体系まとめ
Linuxを学びたいけど、「何から覚えればいいか」「コマンドがバラバラで整理できない」と感じていませんか? このページは、Linux学習をロードマップ形式で体系化し、必…
