grep devuelve "coincidencias de archivo binario (entrada estándar)" cuando intenta encontrar un patrón de cadena en el archivo

71

Estoy en Ubuntu y escribí cat .bash_history | grep gity regresó

El archivo binario (entrada estándar) coincide

Mi bash_historysí existe y hay muchas líneas que comienzan con git.

¿Qué causó la visualización de este error y cómo puedo solucionarlo?

answerSeeker
fuente
¿Cuál es la salida de file .bash_history( file ~/.bash_history)?
heemayl
la salida es.bash_history: data
answerSeeker
por alguna razón, esto solo estaba sucediendo con mis registros de apache. gracias por las
preguntas
muy relacionado: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

Respuestas:

11

Presumiblemente, el archivo .bash_historycomienza con datos que no son de texto, por greplo tanto, trata el archivo como binario. Esto se confirma por la file .bash_historysalida:

.bash_history: data 

Puede leer algunos bytes desde el principio para tener una vista conforme:

head -c1K .bash_history 

Aquí estoy leyendo primero 1 KiB.

Puede canalizar el STDOUT a hexdump/ odo similar.


Como nota al margen, greptoma los nombres de archivo como argumento, por lo que cates inútil aquí; solo haz:

grep git .bash_history
heemayl
fuente
Todavía no estoy seguro de cómo resolver el problema grep, head -c1k .bash_historylea las primeras 38 líneas de mi archivo .bash_history. Todo era legible
answerSeeker
2
@TatakaiWasumi ¿Cuál es la salida de grep -a git .bash_history?
heemayl
1
¡Eso funciono! Obtuve todo lo que quería de él. ¿Qué -ahacer?
answerSeeker
66
@TatakaiWasumi -ahace grepque el archivo sea tratado como binario.
heemayl
3
-ahacer grepprocesar un archivo binario como si fuera texto.
lashgar
128

Puedes usar grep -a 'pattern'.

de la página man grep :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
ALASKA_
fuente
Esto me ha ayudado cuando uso la -zbandera para que coincida en varias líneas.
stragu
Esta respuesta debería ser la mejor para esta pregunta.
Michael Pacheco
Sí, esta respuesta es mucho más adecuada!
Daywalker
3

He visto esta pregunta hoy, porque tuve el mismo problema cuando quería agarrarme .bash_history. (Pequeña nota: cambié el nombre de mi historial para que se creara uno nuevo. Este nuevo historial no se trató como un binario).

En @heemayls answer se dice que greptoma nombres de archivo y catsería inútil. Esto no es enteramente verdad. Desde grepla página de manual de s:

Si no se especifican archivos, o si se proporciona el archivo "-", grep busca entradas estándar.

Para que pueda usarlo caty canalizarlo grep. Sin embargo, esto no resuelve el problema que .bash_historyse trata como un binario. Lo único correcto es usar grep -a(Me gusta en la respuesta de @AK_) ya sea grepel historial directamente o con catuna tubería.


cat .bash_history | grep -a git

o

grep -a git .bash_history

SSCMuchacho
fuente
¡Gracias! Funciona bien para mí
Michael Pacheco