Comando equivalente para grep archivos binarios

24

Tengo un montón de binarios y sé que dentro de estos binarios hay cadenas que quiero encontrar.

Quiero hacer un:

grep -lir "the string I am looking for"

y obtenga una lista de todos los binarios dentro de un directorio particular que contiene esa cadena pero grep -liraparentemente no funciona con estos archivos.

¿Hay algún comando que pueda hacer este tipo de búsqueda desde la terminal?

Perro espacial
fuente

Respuestas:

24

Con GNU grep , puede usar la opción -a para que trate los archivos binarios como archivos de texto:

grep -ali -- string file

Si su versión grep no es compatible -a, puede usar ack en su lugar. Con ack 1.x, debe incluir la -aopción, con ack 2.x, no lo hace, ya que al buscar incluye archivos sin texto por defecto (solo se ignora el archivo sin texto cuando no especificó ningún archivo).

Cuonglm
fuente
¿Estoy leyendo mal ackla autodescripción? (en el manual) "ack 2.x buscará en todos los archivos regulares no binarios que no se ignoran explícitamente [por bla, bla]" Por lo tanto, parece que ack 2.x debería dejar de leer un archivo temprano si el contenido se ve binario.
Peter Cordes
1
@ PeterCordes: Eso ocurrió cuando no se seleccionaron archivos. Intenta ack grep /bin/grepy obtendrás el resultado. Actualicé mi respuesta para evitar confusiones.
Cuonglm
1
Intente usar el comando de cadenas para obtener las cadenas de su binario.
Uwe Burger
23

El comando stringsextraerá todos los datos ASCII de un archivo, si luego grepsu salida, puede buscar sus datos:

strings <filename> | grep "search text"
NZD
fuente
Esta debería ser la respuesta aceptada. Este binario es adecuado para esta tarea.
Vladislavs Dovgalecs
55
@xeon: No siempre es bueno usarlo strings, lea aquí para obtener más detalles.
Cuonglm
1
Dado que el objetivo es determinar qué binarios contienen la cadena, strings -fsería más apropiado.
jamesdlin
Esta es una mejor respuesta.
Xofo
9

Su pregunta es sobre encontrar archivos binarios que contengan un patrón (¡y ya tenemos muy buenas respuestas!). Complementario nos gustaría obtener las ocurrencias.

A menudo uso

grep -aPo '.{0,20}pattern.{0,20}'  binfile

para obtener un contexto circundante de 20 caracteres.

JJoao
fuente