Por que o grep não ignora arquivos binários por padrão?

94

A página de manual para grepdescreve o -Isinalizador da seguinte maneira:

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

Também diz isso sobre arquivos binários:

 --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.

Não consigo pensar em um cenário em que me importaria com correspondências em arquivos binários. Se esse cenário existe, certamente deve ser a exceção e não a norma. Por que não grepignora arquivos binários por padrão, em vez de exigir a configuração desse sinalizador para fazer isso?

Braiam
fonte
4
Você pode definir a variável GREP_OPTIONScom as configurações preferidas e não precisar usar tantas opções de linha de comando.
Marco
2
Uma observação para outros comandos que não suportam essa variável: Você pode definir opções padrão definindo um alias no seu .(ba|z|foo)shrc': alias grep = "grep -I" `.
28613 Erik
1
Isso pode realmente ser muito útil. Por exemplo, eu estava pesquisando a versão unitária de um projeto e não conseguia me lembrar em qual arquivo ele era mantido. Procurei o formato da versão e ela veio com alguns arquivos binários correspondentes. Como era pré-versão 5, a versão estava presente apenas em um arquivo binário; portanto, sem a correspondência binária, eu poderia ter perdido.
Svend Hansen 02/02
FYI Há uma ferramenta ack que é tipo de "melhor do que o grep". O Ack não pesquisa arquivos binários. No Debian, ele vem com o nome "ack-grep".
Teika kazura

Respostas:

91

Nem tudo o que o grep pensa que é um arquivo binário é na verdade um arquivo binário. por exemplo, os registros de marionetes têm um código de cores ansi, o que faz o grep pensar que é binário. Eu ainda gostaria de procurá-los se eu estiver procurando através de / var / log.

Dennis Kaarsemaker
fonte
4
O mesmo vale para arquivos PDF também.
Joseph R.
12
historicamente, o grep NÃO pode fazer isso; portanto, apenas para compatibilidade, o padrão deve ser inclusivo.
Olivier Dulac 28/03
2
@OlivierDulac faz sentido; caso contrário, ignorar os arquivos binários deve ser o padrão.
Dagang
5

grepA capacidade de pesquisar arquivos binários também é útil quando estou compilando um programa e o linker ( ld) reclama que alguma função não foi encontrada. Eu posso usar um comando como

grep function_name / lib / lib *

para encontrar a biblioteca que a contém. (Bibliotecas são arquivos binários.)

Daniel Frużyński
fonte
Nesse caso, você prefere usar grep -l function_name /lib/lib*ou nm -Do /lib/lib* | grep function_nameou ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_name.
Stéphane Chazelas
Bem, grep some_function /lib/*é mais curto e geralmente fornece a resposta correta - nome da biblioteca que estou procurando. Mas sim, às vezes é necessária uma abordagem mais sofisticada como a sua.
Daniel Frużyński