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
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
fazgrep
para tratar o arquivo como binário. -
-a
makegrep
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.
file .bash_history
(file ~/.bash_history
)?.bash_history: data