Estoy en Ubuntu y escribí cat .bash_history | grep git
y devolvió
Coincidencias de archivo binario (entrada estándar)
Mi bash_history
existe y hay muchas líneas en él que comienza con git
.
¿Qué provocó que se mostrara este error y cómo puedo solucionarlo?
Comentarios
Responder
Presuma bly, el archivo .bash_history
comienza con datos que no son de texto, por lo que grep
trata el archivo como binario. Esto es confirmado por la file .bash_history
salida:
.bash_history: data
Puede leer unos pocos bytes desde el principio para tener un vista:
head -c1K .bash_history
Aquí estoy leyendo el primer KiB.
Puede canalizar STDOUT a hexdump
/ od
o similar.
Como nota al margen, grep
toma el nombre de archivo ( s) como argumento, por lo que cat
es inútil aquí; prueba esto:
grep git .bash_history
Comentarios
- I ' Todavía no estoy seguro de cómo resolver el problema de grep,
head -c1k .bash_history
leyó las primeras 38 líneas de mi archivo .bash_history. Todo era legible - @TatakaiWasumi ¿Cuál es el resultado de
grep -a git .bash_history
? - ¡Eso funcionó! Obtuve todo lo que quería de él. ¿Qué hace
-a
? - @TatakaiWasumi
-a
hacegrep
para tratar el archivo como binario. -
-a
hacergrep
procesar un archivo binario como si fuera texto.
Respuesta
Puede usar grep -a "pattern"
.
de la página man grep :
-a, –text
Procesar un archivo binario como si fuera texto; esto es equivalente a la opción –binary-files = text .
Comentarios
- Esto me ha ayudado al usar la marca
-z
para hacer coincidir varias líneas. - Me ha funcionado, pero sigue siendo extraño porque mi archivo no es ' un archivo binario. [grid @ serverdg2 trace] $ file listener.log listener.log: datos
Respuesta
Tenía el mismo problema cuando quiero grep mi .bash_history
. (Nota: Cambié el nombre de mi historial, de modo que se creó uno nuevo. Este nuevo historial no se trató como un binario.)
En la respuesta de @heemayls se indica que grep
toma nombres de archivo y cat
sería inútil. Esto no es enteramente verdad. Desde la página de manual de grep
:
Si no se especifica ningún archivo, o si el archivo «-» es dado, grep busca la entrada estándar.
Así que podría usar cat
y canalizarlo a grep
. Sin embargo, esto no resuelve el problema de que .bash_history
se trate como un binario. Lo único correcto es usar grep -a
(como en la respuesta de @AK_) ya sea que grep
el historial directamente o con cat
y una tubería.
cat .bash_history | grep -a git
o
grep -a git .bash_history
Respuesta
El error se debe a que los datos en el archivo son binarios, puede usar el comando strings para ver la lectura humana (es decir strings
) parte que normalmente buscaría usando grep
strings data | grep -i whatever
Comentarios
- Esto no aborda la primera parte de la pregunta, es decir, " qué causa el problema ".
Respuesta
Esto puede deberse por bytes nulos en su historial de bash. La eliminación de líneas con caracteres nulos puede resolver el problema. Puede verificarlos usando el modo Perl-regexp de grep:
grep -Pa "\x00" .bash_history
Esta publicación tiene sugerencias para sistemas que no son Unix.
file .bash_history
(file ~/.bash_history
)?.bash_history: data