为什么grep默认不忽略二进制文件?


94

的联机帮助页对标志进行了如下grep描述-I

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

它还说明了二进制文件:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

我想不出要关心二进制文件中的匹配的情况。如果存在这种情况,那么肯定一定是例外而不是常规。为什么grep默认情况下不忽略二进制文件而不是要求设置此标志呢?


4
您可以将变量GREP_OPTIONS设置为首选设置,然后不必使用那么多命令行开关。
Marco

2
其他不支持此类变量的命令的注释:您可以通过在.(ba|z|foo)shrc': 别名grep =“ grep -I”`中定义别名来设置默认选项。
Erik 2013年

1
这实际上可能非常有用。例如,我正在搜索项目的统一版本,却不记得它保存在哪个文件中。我搜索版本的格式,然后它提出了一些匹配的二进制文件。原来是5版之前的版本,该版本仅存在于二进制文件中,因此如果没有二进制匹配,我可能会错过它。
Svend Hansen

仅供参考,有一个工具确认,“比grep更好”。Ack不会搜索二进制文件。在Debian中,它的名称为“ ack-grep”。
teika kazura

Answers:


91

并非grep认为的所有内容都是二进制文件,实际上是二进制文件。例如,木偶的日志中有ansi颜色编码,这使grep认为它们是二进制的。如果我通过/ var / log进行搜索,我仍然想搜索它们。


4
PDF文件也是如此。
约瑟夫R.13年

12
+历史上grep无法做到这一点,因此仅出于兼容性考虑,默认值必须是包罗万象的。
Olivier Dulac

2
@OlivierDulac是有意义的,否则忽略二进制文件应为默认设置。
大港

5

grep当我正在编译程序并且链接器(ld)抱怨找不到某个函数时,的搜索二进制文件的功能也很有用。我可以使用类似的命令

grep function_name / lib / lib *

查找包含它的库。(库是二进制文件。)


在这种情况下,您宁愿使用grep -l function_name /lib/lib*or nm -Do /lib/lib* | grep function_nameldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_name虽然。
斯特凡Chazelas

好吧,grep some_function /lib/*它较短,通常可以给出正确的答案-我要查找的库名。但是,是的,有时也需要像您这样的更复杂的方法。
DanielFrużyński2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.