A página de manual de grep
descreve o sinalizador -I
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 de um cenário em que eu me importaria com correspondências em arquivos binários. Se tal cenário existe, certamente deve ser a exceção e não a norma. Por que o “t grep
não ignora os arquivos binários por padrão em vez de exigir a configuração desse sinalizador para fazer isso?
Comentários
- Você pode definir a variável
GREP_OPTIONS
para suas configurações preferidas, então você não ' terá que usar tantas opções de linha de comando . - Uma observação para outros comandos que não suportam essa variável: você pode definir opções padrão definindo um alias em seu
.(ba|z|foo)shrc':
alias grep = " grep -I " `. - Isso pode realmente ser muito útil. Por exemplo, eu estava procurando pela versão Unity de um projeto e não consegui ' lembrar em qual arquivo ele foi mantido. Pesquisei o formato da versão e encontrei alguns arquivos binários que correspondem. Descobri como era pré-versão 5, a versão estava presente apenas em um arquivo binário, então, sem a correspondência binária, eu poderia ter perdido.
- FYI Ther e ' sa tool ack que é uma espécie de " melhor do que grep ". Ack não ' pesquisa arquivos binários. No Debian, ele vem com o nome de " ack-grep ".
Resposta
Nem tudo que o grep pensa ser um arquivo binário, é na verdade um arquivo binário. por exemplo. Os logs do puppet têm códigos de cores ansi, o que faz o grep pensar que são binários. Eu ainda quero pesquisá-los se estiver navegando em / var / log.
Comentários
- O mesmo vale para arquivos PDF como bem.
- + historicamente o grep NÃO poderia fazer isso, então apenas para compatibilidade, o padrão deve ser completo.
- @OlivierDulac faz sentido, caso contrário, ignorar os arquivos binários deve ser o padrão.
Resposta
grep
capacidade de pesquisar Os arquivos binários também são úteis quando estou compilando um programa e o vinculador (ld
) reclama que alguma função não foi encontrada. Posso usar um comando como
grep function_name /lib/lib*
para encontrar a biblioteca que o contém. (Bibliotecas são arquivos binários.)
Comentários
- Nesse caso, você ' prefere usar
grep -l function_name /lib/lib*
ounm -Do /lib/lib* | grep function_name
ouldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_name
. - Bem,
grep some_function /lib/*
é mais curto e geralmente fornece a resposta correta – nome da biblioteca que estou procurando. Mas sim, às vezes uma abordagem mais sofisticada como a sua também é necessária.