grep retorna “Correspondências de arquivos binários (entrada padrão)” ao tentar encontrar um padrão de sequência no arquivo

71

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

Correspondências de arquivos binários (entrada padrão)

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

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

answerSeeker
fonte
Qual é a saída de file .bash_history( file ~/.bash_history)?
heemayl
a saída é.bash_history: data
answerSeeker
por alguma razão, isso estava acontecendo apenas com meus logs do apache. obrigado pelas
perguntas
estreitamente relacionado: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

Respostas:

11

Presumivelmente, o arquivo .bash_historycomeça com dados que não são de texto, portanto, grepestá tratando o arquivo como binário. Isso é confirmado pela file .bash_historysaída:

.bash_history: data 

Você pode ler alguns bytes desde o início para ter uma visão em conformidade:

head -c1K .bash_history 

Aqui estou lendo primeiro 1 KiB.

Você pode canalizar o STDOUT para hexdump/ odou similar.


Como uma observação lateral, greptoma o (s) nome (s) do (s) nome (s) do arquivo como argumento, então caté inútil aqui; apenas faça:

grep git .bash_history
heemail
fonte
Ainda não sei como resolver o problema grep, head -c1k .bash_historyleia as primeiras 38 linhas do meu arquivo .bash_history. Tudo estava legível
answerSeeker
2
@TatakaiWasumi Qual é a saída de grep -a git .bash_history?
heemayl
11
Isso funcionou! Consegui tudo o que queria. O que -afaz?
answerSeeker
6
@TatakaiWasumi -afaz greppara tratar o arquivo como binário.
heemayl
3
-afaça grepprocessar um arquivo binário como se fosse texto.
Lashgar:
128

Você pode usar grep -a 'pattern'.

da página man grep :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
AK_
fonte
Isso me ajudou ao usar a -zbandeira para corresponder em várias linhas.
stragu
Esta resposta deve ser a melhor para esta pergunta.
Michael Pacheco
Sim, esta resposta é muito mais adequada!
Daywalker 13/07
3

Eu vi essa pergunta hoje, porque tive o mesmo problema quando quero cumprimentar o meu .bash_history. (Nota: renomeei meu histórico para criar um novo. Esse novo histórico não foi tratado como binário.)

Na resposta @heemayls, é declarado que grepleva nomes de arquivos e catseria inútil. Isso não é inteiramente verdade. Na greppágina do manual s:

Se nenhum arquivo for especificado, ou se o arquivo “-” for fornecido, o grep pesquisará a entrada padrão.

Então você pode usar cate canalizar 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ê faz grepa história diretamente ou com catum cachimbo.


cat .bash_history | grep -a git

ou

grep -a git .bash_history

SSCMuchacho
fonte
Obrigado! Funciona bem para mim
Michael Pacheco