首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要获得grep -I的“二进制文件匹配”?

为什么我要获得grep -I的“二进制文件匹配”?
EN

Unix & Linux用户
提问于 2019-04-02 10:22:48
回答 1查看 8.3K关注 0票数 6

在下面的示例中,grep的行为很奇怪:它提供了-I选项,根据手册页,该选项应该使grep忽略二进制文件(类似于--binary-files=without-match),但我仍然得到“二进制文件匹配”输出。

代码语言:javascript
复制
$ cat <<'EOF' | uudecode > test-file
begin 664 /dev/stdout
M>`&5SLU*Q在下面的示例中,grep的行为很奇怪:它提供了-I选项,根据手册页,该选项应该使grep忽略二进制文件(类似于--binary-files=without-match),但我仍然得到“二进制文件匹配”输出。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?9F0/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选项所规定的那样被忽略?

我在Ubuntu18.04上使用GNU grep 3.1。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-04-02 10:41:54

看看grep手册,这似乎是因为(大胆的):

如果类型是‘without-match’,当grep发现空输入二进制数据时,它假设文件的其余部分不匹配;这相当于-I选项。

但是,grep还认为其他数据表示二进制文件:

非文本字节表示二进制数据;它们要么是对当前区域设置编码不当的输出字节(参见环境变量),要么是在未给出-z (--null-data)选项时为空输入字节(参见其他选项)。

因此,如果:

  • 给出了-I/--binary-files=without-match选项
  • 二进制性是由空字节造成的。

但是,示例输入的情况并非如此。示例文件被视为二进制文件,因为它不适合当前的区域设置(可能是一些UTF语言环境),而不是因为它有空字节。否则:

代码语言:javascript
复制
% 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将成功失败:

代码语言:javascript
复制
% printf '\0' >> test-file
% grep -I 8 test-file    
% echo $?
1
票数 10
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/510044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档