こんにちは。
grep
コマンドへ、不正なバイナリーバイトが含まれているテキストデータを渡した場合を調べました。
マッチ自体は成立したが不正なバイトデータを検出した場合には、デフォルトでは標準エラー出力へメッセージを出力し(binary file matches
)、通常のマッチ結果は出力せず処理終了するようです1 2(終了ステータスはマッチ成立を意味する 0
)。
このような場合に、-a
(--text
) オプションを指定すると最後まで通常処理を続けます(下記例)。ただし、出力には不正なバイナリーバイトが含まれている可能性があります。
また巨大なデータの末尾に不正なバイトデータが含まれているような場合は、処理冒頭では未検出のためか、検出までは通常処理を続けるようです。メッセージを見ると気がつくことになります。
$ printf 'oooooooooooooooooooo\nA\0' | ggrep -a 'A'
A
$ printf 'oooooooooooooooooooo\nA\0' | tr -d '\0' | ggrep 'A'
A
$ printf 'oooooooooooooooooooo\nA\0' | strings | ggrep 'A'
$ printf 'oooooooooooooooooooo\nA\0' | ggrep 'A'
ggrep: (standard input): binary file matches
$ ggrep -V | head -n1
ggrep (GNU grep) 3.6
テキストデータに不正なバイトが含まれているかどうかを判定する方法
テキストデータに不正なバイトが含まれていることを検出する方法を調べました。しかし、どれも必ずしも率直に信じると危ないようです。
-
grep
コマンド利用。マッチ成立条件で動かし、メッセージbinary file matches
の有無を調べる。 -
nkf --guess
コマンド利用。BINARY
と判定。 -
file
コマンド利用。data
と判定。ただしUTF-8 Unicode text, with very long lines
と判定される事例もある。
-
参考:「grep の「バイナリファイル (標準入力) に一致しました」が出る条件を調べていたらそれは長い旅路の始まりだった。」 ↩
-
GNU grep 3.4 以前では、標準エラー出力ではなく、標準出力へメッセージが出力されます(
Binary file (standard input) matches
)。 ↩