grep -Iを使用して「バイナリファイルの一致」を取得するのはなぜですか?

grep -Iを使用して「バイナリファイルの一致」を取得するのはなぜですか?

次の例では、動作は奇妙です。マニュアルページでは、バイナリ(例:)を無視するオプションがありますgrepが、まだ「バイナリ一致」出力が表示されます。-Igrep--binary-files=without-match

$ cat <<'EOF' | uudecode > test-file
begin 664 /dev/stdout
M>`&5SLU*Q$`0!&#/>8J^"TM/=^8/1%2\>1`\>.^9Z=D-9!))9@7?WBB^@%"G
MHOBHO+8V=2!'-WU3A9PX%*8PBB:VGK@6)Y*HFAB(.2;.;$SQPX=LNG3(>2SH
MDJE!5;R+E9P21J::8U2+?@R>RK&7:[^L&[Q=]UD6>)$D?9<O_82[Y$\&S4_,
MP[G)-)_RVN[!6(S.>F0/M\B(P]$>5[O^%_$8+/(?,CSI+]%DD;/"^^,K3`OD
,6?8=GK6MPS?WDU!"
`
end
EOF
$ grep -I 8 test-file
Binary file test-file matches
$ grep --binary-files=without-match 8 test-file
Binary file test-file matches

もちろん、grepファイルバイナリを考慮しますが、まだ一致しようとし、結果を報告してください。-Iオプションで指定されているように「バイナリ」が無視されないのはなぜですか?

Ubuntu 18.04でGNU grep 3.1を使用しています。

ベストアンサー1

見ているgrep マニュアル、これは次の理由のようです(太字):

もしタイプwithout-matchその時grep は空の入力バイナリデータを探します。 ファイルの残りの部分が一致しないと仮定します。これはこの-Iオプションと同じです。

しかし、grepは他のデータもバイナリファイルを表すと思います。

非テキストバイトはバイナリデータを表します。これは現在のロケールに対して誤ってエンコードされた出力バイトです。環境変数)または-z()オプションが指定されていない場合は空の入力バイトです。--null-dataその他のオプション)。

したがって、次の場合、メッセージは印刷されません。

  • 与えられた-I/--binary-files=without-matchオプション
  • そしてバイナリはヌルバイトが原因で発生します。

ただし、入力例の場合はそうではありません。サンプルファイルは、nullバイトがあるためではなく、現在のロケール(一部のUTFロケール)に収まらないため、バイナリファイルと見なされます。それ以外の場合:

% LC_ALL=C grep 8 test-file  
x���J�@`�y��
dIf��(��P������6u G7}S��8�0�&���'����9&�lL�Çl�t�y,蒩AU����F��cT�~
                                                                 �ʱ�k��]�Yx�$}�/����O�O�ù�4�����X��zd�Ȉ��W���,�2<�/�d�����+L
                                                                                                                            �Y�����7��PB

ファイルにヌルバイトを追加すると、grepは正常に失敗します。

% printf '\0' >> test-file
% grep -I 8 test-file    
% echo $?
1

おすすめ記事