Como faço para grep através de arquivos binários que se parecem com texto?

76

Eu tenho arquivos binários que devem ser texto (são logs exportados), mas não consigo abri-lo com menos (parece feio - parece um arquivo binário). Descobri que era possível abri-lo com o vi e posso obtê-lo (você verá os logs reais), mas o que eu realmente gostaria de fazer é fazer um grep através deles (sem ter que abrir cada um com o vi e executar uma pesquisa). Existe uma maneira de eu fazer isso?

Robyn Smith
fonte
11
Você tentou grep -a?
Quanta
1
stackoverflow.com/questions/9988379/…
Ciro Santilli escreveu

Respostas:

85

Você pode usar de grepqualquer maneira para pesquisar no arquivo - ele realmente não se importa se o arquivo de entrada é realmente texto ou não. Do 'man grep':

    -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

Por favor, marque as palavras de cautela no final do segundo parágrafo. Você pode redirecionar os resultados do grep para um novo arquivo e examiná-lo com vi / less.

Axel Knauf
fonte
grep realmente não funciona. tente grep em um dispositivo de armazenamento. ficará sem memória. possui um mecanismo de buffer interno quebrado que depende de linhas de comprimento razoáveis.
user239558
41

Canalize-o strings, o que removerá todo o código binário, deixando apenas o texto.

Mike Scott
fonte
stringsaparentemente não entende utf-8 é texto.
Javier
6

bgrepuma chance. ( versão original / fork mais recente )

quanta
fonte
Eu acho que esta é a melhor resposta aqui. É tão irritante ver implementações ruins de pesquisa binária como aqui commandlinefu.com/commands/matching/grep-binary/… onde a fuga por \xrealmente não funciona como aqui grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz,
Eu corro, bgrep "fafafafa" test_27.6.2015.bin |lessmas obtenho test_27.6.2015.bin: 00005ee4 . Eu assumiria que fafafafa , já que estava pesquisando isso. Nenhum manual no homem. Alguma idéia de por que essa saída?
Léo Léopold Hertz,
Eu abri um novo tópico sobre o funcionamento do bgrep aqui stackoverflow.com/q/31135561/54964
Léo Léopold Hertz 준영
qual é a diferença grep -a?
rubo77
Infelizmente bash: bgrep: command not found...e No package bgrep available.
5

Você pode usar estes três comandos:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>

MLSC
fonte
o tr parece não funcionar na minha caixa solaris 10. Teste simples: eco -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' não traduz a guia.
user55570
1

A partir do Grep 2.21, os arquivos binários são tratados de maneira diferente :

Ao pesquisar dados binários, o grep agora pode tratar bytes que não são de texto como terminadores de linha. Isso pode aumentar significativamente o desempenho.

Então, o que acontece agora é que, com dados binários, todos os bytes que não são de texto (incluindo novas linhas) são tratados como terminadores de linha. Se você deseja alterar esse comportamento, você pode:

  • use --text. Isso garantirá que apenas as novas linhas sejam terminadores de linha

  • use --null-data. Isso garantirá que apenas bytes nulos sejam terminadores de linha

Steven Penny
fonte