grep retorna “ Arquivo binário (entrada padrão) corresponde a ” ao tentar encontrar um padrão de string no arquivo

Estou no Ubuntu e digitei cat .bash_history | grep git e ele retornou

Arquivo binário (entrada padrão) corresponde a

Meu bash_history existe e contém muitas linhas que começa com git.

O que causou a exibição desse erro e como posso corrigi-lo?

Comentários

  • Qual é o resultado de file .bash_history (file ~/.bash_history)?
  • o resultado é .bash_history: data
  • por algum motivo, isso estava acontecendo apenas com meus registros do Apache. obrigado por q & a
  • intimamente relacionado: unix.stackexchange.com/q/19907/5510

Resposta

Presuma bly o arquivo .bash_history começa com dados não textuais, portanto, grep está tratando o arquivo como binário. Isso é confirmado pela file .bash_history saída:

.bash_history: data 

Você pode ler alguns bytes do início para ter uma conformidade visualizar:

head -c1K .bash_history 

Aqui estou lendo o primeiro 1 KiB.

Você pode canalizar o STDOUT para hexdump / od ou semelhante.


Como uma observação lateral, grep leva o nome do arquivo ( s) como argumento, então cat é inútil aqui; tente isto:

grep git .bash_history 

Comentários

  • I ' ainda não tenho certeza de como resolver o problema grep, head -c1k .bash_history leia as primeiras 38 linhas do meu arquivo .bash_history. Tudo estava legível
  • @TatakaiWasumi Qual é o resultado de grep -a git .bash_history?
  • Funcionou! Consegui tudo o que queria com isso. O que -a faz?
  • @TatakaiWasumi -a faz grep para tratar o arquivo como binário.
  • -a make grep processa um arquivo binário como se fosse texto.

Resposta

Você pode usar grep -a "pattern".

da página man grep :

-a, –text
Processa um arquivo binário como se fosse texto; isso é equivalente à opção –binary-files = text .

Comentários

  • Isso me ajudou ao usar o sinalizador -z para corresponder em várias linhas.
  • Funcionou para mim, mas ainda é estranho porque meu arquivo não é ' um arquivo binário. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Resposta

Eu tive a mesmo problema quando eu quero grep meu .bash_history. (Pequena nota: renomeei meu histórico para que um novo fosse criado. Esse novo histórico não foi tratado como binário.)

Na resposta @heemayls afirma-se que grep leva nomes de arquivos e cat seria inútil. Isso não é inteiramente verdade. Da página de manual grep s:

Se nenhum arquivo for especificado ou se o arquivo “-” for dado, grep pesquisa a entrada padrão.

Então você poderia usar cat e canalizá-lo para grep. No entanto, isso não resolve o problema de .bash_history ser tratado como binário. A única coisa certa é usar grep -a (como na resposta de @AK_) se você grep o histórico diretamente ou com cat e um tubo.


cat .bash_history | grep -a git 

ou

grep -a git .bash_history 

Resposta

O erro é devido aos dados no arquivo serem binários, você pode usar o comando de strings para ver o legível por humanos (ou seja strings) parte que você normalmente pesquisaria usando grep

strings data | grep -i whatever

Comentários

  • Isso não aborda a primeira parte da pergunta, ou seja, " o que causa o problema ".

Resposta

Isso pode ser causado por bytes nulos em seu histórico do bash. Remover linhas com caracteres nulos pode resolver o problema. Você pode verificá-los usando o modo Perl-regexp grep “s:

grep -Pa "\x00" .bash_history 

Esta postagem tem sugestões para sistemas não-unix.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *