grep devuelve “ El archivo binario (entrada estándar) coincide con ” al intentar encontrar un patrón de cadena en el archivo

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

  • ¿Cuál es el resultado de file .bash_history (file ~/.bash_history)?
  • el resultado es .bash_history: data
  • por alguna razón, esto estaba sucediendo con mis registros de Apache. Gracias por la q & a
  • muy relacionado: unix.stackexchange.com/q/19907/5510

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 hace grep para tratar el archivo como binario.
  • -a hacer grep 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *