grep retorna “Correspondências de arquivo binário (entrada padrão)” ao tentar localizar um padrão de seqüência de caracteres no arquivo

44

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

Binary file (standard input) matches

Meu bash_history existe e há muitas linhas nele que começam com git .

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

    
por answerSeeker 08.01.2017 / 06:03

3 respostas

8

Presumivelmente, o arquivo .bash_history inicia com dados que não são de texto, portanto, grep está tratando o arquivo como binário. Isso é confirmado pelo file .bash_history output:

.bash_history: data 

Você pode ler alguns bytes do início para ter uma visualização em conformidade:

head -c1K .bash_history 

Aqui estou lendo primeiro 1 KiB.

Você pode enviar o STDOUT para hexdump / od ou similar.

Como nota lateral, grep toma nome (s) de arquivo como argumento, então cat é inútil aqui; apenas faça:

grep git .bash_history
    
por 08.01.2017 / 06:15
81

Você pode usar grep -a 'pattern' .

da página homem grep :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
    
por 20.07.2017 / 16:05
1

Eu já vi essa pergunta hoje, porque tive o mesmo problema quando quis usar meu .bash_history . (Pequena Nota: Eu renomeiei minha história, de modo que uma nova foi criada. Essa nova história não foi tratada como um binário.)

Na resposta do @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:

If no files are specified, or if the file “-” is given, grep searches standard input.

Você pode usar cat e canalizá-lo para grep . No entanto, isso não resolve o problema que .bash_history é tratado como um 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 pipe.

cat .bash_history | grep -a git

ou

grep -a git .bash_history

    
por 19.01.2018 / 19:16