はじめに
grepはテキスト検索で広く使われるコマンドですが、バイナリファイルを対象にすると想定どおりに検索できないことがあります。
本記事では、ポイントを初学者にも分かりやすく整理して解説します。
参考元: GNU grep
grepでバイナリファイルを検索する方法
ファイル作成
cat << 'EOF' > input.txt
Hello World
Linux Text Data
BINARY_DATA_START
EOF
ファイル作成
echo -e ' \x00\x01\x02\x03\x04\xFF' >> input.txt
ファイル作成
cat << 'EOF' >> input.txt
BINARY_DATA_END
grep sample text
EOF
実行コマンド
grep "grep" input.txt
実行結果
Binary file input.txt matches
実行コマンド
grep -a "BINARY_DATA" input.txt
実行結果
BINARY_DATA_START
BINARY_DATA_END
実行コマンド
grep --binary-files=text "BINARY_DATA" input.txt
実行結果
BINARY_DATA_START
BINARY_DATA_END
仕組み
| オプション | 仕組み | 用途 |
|---|---|---|
| grep -a | バイナリファイルをテキストとして扱って検索する | バイナリファイル内の文字列検索 |
| grep --binary-files=text | バイナリ判定を無効化しテキストとして処理する | -a と同等の動作 |
| 通常の grep | NULバイト(0x00)などを検出するとバイナリファイルと判断する | テキストファイル検索 |
解説
上記では echo -e '\x00\x01\x02\x03\x04\xFF' により実際のバイナリデータをファイルへ追記しています。
grep -a や --binary-files=text を利用することで、バイナリを含むファイルでも文字列検索が可能です。
grepでバイナリファイル検索時に「Binary file matches」が表示される理由
ファイル作成
echo -e 'text\n\0binary\n' > binary.dat
実行コマンド
grep "binary" binary.dat
実行結果
Binary file binary.dat matches
実行コマンド
grep -a "binary" binary.dat
実行結果
binary
仕組み
| 項目 | 内容 |
|---|---|
| 「Binary file matches」が表示される理由 | grepがNUL文字(\0)などを検出し、ファイルをバイナリファイルと判定するため |
| grepの動作 | バイナリと判定すると内容表示を省略し、「Binary file xxx matches」を出力する |
| 目的 | 端末への制御文字出力や文字化けを防ぐため |
| -a オプション | バイナリファイルをテキストとして扱い、マッチした行を表示する |
| --binary-files=text | -a と同等の動作を行う |
解説
grepはファイル内にNUL文字などが含まれるとバイナリファイルと判断します。
そのため通常は一致した行を表示せず、「Binary file matches」というメッセージのみを出力します。
grepでバイナリファイル検索結果のファイル名だけを表示する方法
ファイル作成
cat << 'EOF' > input.txt
sample text
ERROR message
binary data
EOF
ファイル作成
echo -e '\x00\x01\x02ERROR\x03\x04' > binary.dat
実行コマンド
grep -rlI "ERROR" .
実行結果
./input.txt
実行コマンド
grep -rl "ERROR" .
実行結果
./input.txt
./binary.dat
仕組み
| オプション | 役割 | バイナリファイルの扱い |
|---|---|---|
| -l | 一致したファイル名のみ表示 | バイナリでもファイル名を表示 |
| -r | ディレクトリを再帰検索 | 配下の全ファイルを検索 |
| -I | バイナリファイルを無視 | バイナリファイルを検索対象外にする |
解説
grep -l を使用すると、一致した行ではなくファイル名だけを表示できます。
バイナリファイルも対象にしたい場合は -l を使用し、除外したい場合は -I を組み合わせます。
grepでバイナリファイル検索対象の拡張子を限定する方法
ファイル作成
cat << 'EOF' > input.txt
error: database connection failed
EOF
ファイル作成
echo -e '\x00\x01\x02error\x03\x04' > sample.bin
ファイル作成
echo -e 'error: application failed\n' > sample.log
ファイル作成
echo -e 'error: network failed\n' > sample.txt
実行コマンド
grep --include="*.log" --include="*.txt" -rn "error" .
実行結果
./sample.log:1:error: application failed
./sample.txt:1:error: network failed
実行コマンド
grep -rn "error" .
実行結果
./sample.log:1:error: application failed
./input.txt:1:error: database connection failed
./sample.txt:1:error: network failed
Binary file ./sample.bin matches
仕組み
| 項目 | 内容 |
|---|---|
| grep -r | ディレクトリ配下を再帰的に検索 |
| --include="*.log" | .log ファイルのみ検索対象にする |
| --include="*.txt" | .txt ファイルのみ検索対象にする |
| バイナリファイル除外 | 指定拡張子以外を検索しないため .bin を対象外にできる |
| 効果 | Binary file matches のような不要な結果を回避できる |
解説
grep は再帰検索時にバイナリファイルも対象にするため、意図しない一致が発生します。
--include で検索対象の拡張子を限定すると、テキストファイルだけを効率よく検索できます。
grepの--binary-filesオプションの使い方
ファイル作成
echo -e 'Hello World\nBinaryData\n\0\nAnother Line\n' > binary.txt
実行コマンド
grep "BinaryData" binary.txt
実行結果
Binary file binary.txt matches
実行コマンド
grep --binary-files=text "BinaryData" binary.txt
実行結果
BinaryData
実行コマンド
grep --binary-files=without-match "BinaryData" binary.txt
実行結果
no output
仕組み
| 項目 | 内容 |
|---|---|
| --binary-files=text | バイナリファイルをテキストとして扱い、通常どおり検索結果を表示する。 |
| --binary-files=without-match | バイナリファイルを検索対象外として扱い、一致した場合も出力しない。 |
| デフォルト動作 | バイナリファイルを検出すると binary file matches と表示し、内容は出力しない。 |
解説
grep はNULL文字などを含むファイルをバイナリとして判定します。
--binary-files オプションを使用すると、バイナリファイルをテキストとして検索するか、検索対象外にするかを制御できます。
grepの-aオプションとバイナリファイル検索の違い
ファイル作成
cat << 'EOF' > input.txt
Hello World
Linux
grep sample
ABC
grep binary test
EOF
ファイル作成
echo -e "\0\n" >> input.txt
実行コマンド
grep "grep" input.txt
実行結果
Binary file input.txt matches
実行コマンド
grep -a "grep" input.txt
実行結果
grep sample
grep binary test
仕組み
| 項目 | grep | grep -a |
|---|---|---|
| バイナリファイル検出 | NUL文字を検出するとバイナリファイルとして扱う | テキストファイルとして強制的に扱う |
| 検索結果 | binary file matchesのみ表示 | 一致した行を表示 |
| 用途 | バイナリデータを誤表示しないため | バイナリに混在した文字列を調査したい場合 |
解説
通常のgrepはNUL文字を含むファイルをバイナリファイルと判断し、一致のみを通知します。
-aオプションを付けるとテキストとして扱うため、バイナリファイル内に含まれる文字列も表示できます。
grepでバイナリファイルをテキストとして扱う方法
ファイル作成
echo -e '\x00\x01\x02grep-test\x03\x04' > binary.dat
実行コマンド
grep 'grep-test' binary.dat
実行結果
Binary file binary.dat matches
実行コマンド
grep -a 'grep-test' binary.dat
実行結果
grep-test
実行コマンド
grep --binary-files=text 'grep-test' binary.dat
実行結果
grep-test
仕組み
| 項目 | 内容 |
|---|---|
| 通常のgrep | バイナリファイルを検出すると内容を表示せず「Binary file ~ matches」と出力する |
| -a | バイナリファイルをテキストとして扱う(--textと同義) |
| --binary-files=text | バイナリ判定を無視してテキストとして検索する |
| 利用場面 | ログにバイナリデータが混在している場合や、文字列が埋め込まれた実行ファイルを調査する場合 |
解説
grep は NULL 文字などを検出するとバイナリファイルと判断します。
-a または --binary-files=text を指定すると、バイナリファイルでもテキストとして検索結果を表示できます。
grepでバイナリファイルを除外して検索する方法
ファイル作成
cat << 'EOF' > input.txt
text data
error message
binary file
EOF
ファイル作成
echo -e '\x00\x01\x02binary-data\x03\x04' > binary.dat
実行コマンド
grep --binary-files=without-match "binary" *
実行結果
input.txt:binary file
仕組み
| 項目 | 内容 |
|---|---|
| grep | ファイル内の文字列を検索するコマンド |
| --binary-files=without-match | バイナリファイルを検索対象外として扱う |
| "binary" | 検索するキーワード |
| * | カレントディレクトリ内の全ファイルを対象にする |
| 効果 | バイナリファイルによるノイズを除外し、テキストファイルのみ検索できる |
解説
grep は通常、バイナリファイルを検出すると「Binary file matches」と表示します。
--binary-files=without-match を指定するとバイナリファイルを無視して検索できるため、ソースコードやログ検索で便利です。
grepの-Iオプションとバイナリファイル除外の違い
ファイル作成
echo -e 'text data\nbinary\0data\nhello world\n' > input.txt
実行コマンド
grep "data" input.txt
実行結果
Binary file input.txt matches
実行コマンド
grep -I "data" input.txt
実行結果
no output
実行コマンド
grep --binary-files=without-match "data" input.txt
実行結果
no output
仕組み
| 項目 | grep -I | grep --binary-files=without-match |
|---|---|---|
| 動作 | バイナリファイルと判定した場合は一致しないものとして扱う | バイナリファイルを一致しないものとして扱う |
| 対象 | -I は --binary-files=without-match の短縮オプション | 同じ動作をオプション名で指定 |
| 可読性 | 短く書ける | 意味が明確でスクリプト向き |
| 用途 | 手入力のコマンド | 設定やシェルスクリプトなど |
解説
-I は --binary-files=without-match の省略形であり、動作に違いはありません。どちらもバイナリファイルを検索対象から実質的に除外し、Binary file matches の表示を防ぐために利用します。
grepで再帰検索時にバイナリファイルを制御する方法
ファイル作成
cat << 'EOF' > sample.txt
Hello World
ERROR
EOF
ファイル作成
cat << 'EOF' > app.log
ERROR
Application ERROR
EOF
ファイル作成
cat << 'EOF' > readme.md
grep sample
ERROR
EOF
ファイル作成
mkdir -p bin images
ファイル作成
echo -e '\x7fELF\x02\x01\x01ERROR\0' > bin/app
ファイル作成
echo -e '\x89PNG\r\n\x1a\nERROR\0' > images/logo.png
実行コマンド
grep -r "ERROR" .
実行結果
Binary file ./bin/app matches
Binary file ./images/logo.png matches
./readme.md:ERROR
./app.log:ERROR
./app.log:Application ERROR
./sample.txt:ERROR
実行コマンド
grep -rI "ERROR" .
実行結果
./readme.md:ERROR
./app.log:ERROR
./app.log:Application ERROR
./sample.txt:ERROR
実行コマンド
grep -ra "ERROR" .
実行結果
./bin/app:ELFERROR
./images/logo.png:ERROR
./readme.md:ERROR
./app.log:ERROR
./app.log:Application ERROR
./sample.txt:ERROR
仕組み
| オプション | 仕組み | 用途 |
|---|---|---|
| -r | ディレクトリを再帰的に検索し、バイナリファイルを検出すると内容は表示せず「Binary file ~ matches」と出力する | 標準的な再帰検索 |
| -rI | バイナリファイルを検索対象から除外する | ソースコードやテキストファイルのみ検索したい場合 |
| -ra (--binary-files=text) | バイナリファイルをテキストとして扱い、一致した内容も表示する | バイナリファイル内の文字列も検索したい場合 |
解説
grep は通常、バイナリファイルを検出すると内容を表示せず「Binary file ~ matches」と出力します。
-I を指定するとバイナリファイルを無視し、-a を指定するとバイナリファイルをテキストとして扱って内容まで表示できます。
grepでバイナリファイル検索時の文字コード問題
実行コマンド
grep "he" /bin/ls
実行結果
Binary file /bin/ls matches
実行コマンド
grep -a "he" /bin/ls
実行結果
バイナリデータ中の一致箇所を含む行が表示される
実行コマンド
grep --binary-files=text "he" /bin/ls
実行結果
バイナリデータ中の一致箇所を含む行が表示される
仕組み
| 項目 | 内容 |
|---|---|
| grepの通常動作 | NULL文字などを検出するとバイナリファイルと判断する |
| Binary file matches | 一致はしたが内容表示を抑止している状態 |
| -a | バイナリファイルをテキストとして扱う |
| --binary-files=text | -a と同等の動作 |
| -I | バイナリファイルを無視して検索する |
| 文字コード問題との関係 | 文字コード誤認やNULL文字混入によりテキストでもバイナリ扱いされることがある |
解説
grepは内部でNULL文字などを検出するとテキストではなくバイナリファイルと判断します。
そのため検索結果が表示されず「バイナリファイルが一致しました」となり、-a や --binary-files=text を利用して強制的にテキストとして扱います。
grepでUTF-8以外のファイルがバイナリ判定されるケース
ファイル作成
cat << 'EOF' > input.txt
grep processes files as text by default.
When a file contains non-UTF-8 encoded data or NUL bytes (0x00),
grep may determine that the file is a binary file.
EOF
ファイル作成
echo -e "\0" >> input.txt
実行コマンド
grep "grep" input.txt
実行結果
Binary file input.txt matches
実行コマンド
grep -a "grep" input.txt
実行結果
grep processes files as text by default.
grep may determine that the file is a binary file.
仕組み
| 項目 | 内容 |
|---|---|
| grepの判定 | grepはNULバイトを検出するとバイナリファイルと判断することがある |
| UTF-8以外との関係 | Shift_JISやEUC-JPなどでも内容によってはバイナリ判定される場合がある |
| 表示メッセージ | Binary file input.txt matches |
| -a オプション | バイナリ判定を無視してテキストとして処理する |
解説
grepは文字コードそのものではなく、主にNULバイトなどの内容からバイナリ判定を行います。
UTF-8以外のファイルでは文字列パターンによってバイナリと誤認されるケースがあるため、必要に応じて grep -a を利用します。
grepとstringsを組み合わせてバイナリファイルを検索する方法
ファイル作成
cat << 'EOF' > input.txt
Hello World
User: alice
Password: secret123
API_KEY=ABC123XYZ
ERROR: Connection failed
TOKEN=xyz987
EOF
ファイル作成
echo -e '\x00\x01\x02' >> input.txt
実行コマンド
grep "ERROR" input.txt
実行結果
Binary file input.txt matches
実行コマンド
strings input.txt
実行結果
Hello World
User: alice
Password: secret123
API_KEY=ABC123XYZ
ERROR: Connection failed
TOKEN=xyz987
実行コマンド
strings input.txt | grep "ERROR"
実行結果
ERROR: Connection failed
実行コマンド
strings input.txt | grep -Ei "password|token"
実行結果
Password: secret123
TOKEN=xyz987
仕組み
| 項目 | 内容 |
|---|---|
| strings | バイナリファイル内から表示可能な文字列のみを抽出する |
| grep | 抽出された文字列から指定したキーワードを検索する |
| パイプ (|) | strings の出力を grep に渡して絞り込み検索を行う |
| 利点 | バイナリファイル全体を直接検索するより、埋め込まれた文字列を効率よく発見できる |
解説
stringsで可読文字列を取り出してからgrepで検索することで、実行ファイルや圧縮ファイル内に含まれるエラーメッセージや認証情報などを素早く見つけられます。
バイナリファイルを調査する際の基本的な組み合わせとしてよく利用されます。
grepとhexdumpを使ったバイナリファイル解析
ファイル作成
cat << 'EOF' > sample.bin
Hello
Linux
grep
Binary
DATA
EOF
ファイル作成
printf '\0TEXT' >> sample.bin
実行コマンド
grep 'TEXT' sample.bin
実行結果
Binary file sample.bin matches
実行コマンド
grep -a 'TEXT' sample.bin
実行結果
TEXT
実行コマンド
hexdump -C sample.bin
実行結果
00000000 48 65 6c 6c 6f 0a 4c 69 6e 75 78 0a 67 72 65 70 |Hello.Linux.grep|
00000010 0a 42 69 6e 61 72 79 0a 44 41 54 41 0a 00 54 45 |.Binary.DATA..TE|
00000020 58 54 |XT|
00000022
仕組み
| コマンド | 仕組み |
|---|---|
| grep 'TEXT' sample.bin | NUL (0x00) を含むためバイナリファイルと判定し、Binary file sample.bin matches を出力する。 |
| grep -a 'TEXT' sample.bin | -a オプションによりテキストとして扱い、一致した行を表示する。 |
| hexdump -C sample.bin | ファイルを16進数とASCII形式で表示し、バイナリデータの内容を確認できる。 |
解説
grep は NUL 文字を含むファイルをバイナリファイルと判定します。
hexdump -C を併用すると、文字列だけでなく実際のバイト列も確認できるため、バイナリファイルの解析に役立ちます。
grepでバイナリファイル検索が失敗する場合の対処法
ファイル作成
cat << 'EOF' > input.txt
Text data
ERROR: application failed
Process completed successfully
EOF
ファイル作成
echo -e '\x89PNG\r\n\x1a\nERROR: binary data\n\0' > binary.dat
実行コマンド
grep "ERROR" *
実行結果
Binary file binary.dat matches
input.txt:ERROR: application failed
実行コマンド
grep -a "ERROR" *
実行結果
binary.dat:ERROR: binary data
input.txt:ERROR: application failed
実行コマンド
grep --binary-files=text "ERROR" *
実行結果
binary.dat:ERROR: binary data
input.txt:ERROR: application failed
仕組み
| オプション | 仕組み | 用途 |
|---|---|---|
| grep "ERROR" * | grepがバイナリと判定したファイルは内容を表示せず「binary file matches」と出力 | 通常検索 |
| grep -a "ERROR" * | バイナリファイルをテキストとして扱って検索 | バイナリ内の文字列確認 |
| grep --binary-files=text "ERROR" * | バイナリ判定を無効化しテキスト扱いで検索 | スクリプトや自動処理向け |
解説
grepはNUL文字などを検出するとバイナリファイルと判断し、マッチした内容を表示しないことがあります。
-a または --binary-files=text を使用すると、バイナリファイル内の文字列も通常のテキストと同様に検索できます。
grepでバイナリファイルを理解して検索するポイント
grepは通常、バイナリファイルを検出すると出力を抑制し、Binary file matchesと表示します。
内容を確認したい場合は-aや--binary-files=textを利用し、除外したい場合は-Iや--binary-files=without-matchが便利です。
検索結果が期待どおりにならない場合は、オプションや文字コード、対象ファイルの種類を確認することが解決への近道です。

