linux bash binary grep ascii

linux - Desplazamiento "grep" de la cadena ascii desde un archivo binario



bash binary (3)

Estoy generando archivos de datos binarios que son simplemente una serie de registros concatenados juntos. Cada registro consta de un encabezado (binario) seguido de datos binarios. Dentro del encabezado binario hay una cadena ASCII de 80 caracteres de longitud. En algún momento, mi proceso de escritura de los archivos se desordenó un poco y estoy tratando de solucionar este problema al inspeccionar el tiempo que cada registro es.

This parece extremadamente relacionado, pero no entiendo Perl, así que no he podido obtener la respuesta aceptada para que funcione. La otra respuesta apunta a bgrep que he compilado, pero quiere que le bgrep una cadena hexadecimal y prefiero tener una herramienta donde pueda darle la cadena ascii y la encontrará en los datos binarios, imprimir la cadena y el byte de desplazamiento donde se encontró.

En otras palabras, estoy buscando una herramienta que actúe así:

tool foobar filename

o

tool foobar < filename

y su salida es algo como esto:

foobar:10 foobar:410 foobar:810 foobar:1210 ...

por ejemplo, la cadena que coincide y un desplazamiento de bytes en el archivo donde comenzó la coincidencia. En este caso de ejemplo, puedo inferir que cada registro tiene una longitud de 400 bytes.

Otras restricciones:

  • la capacidad de búsqueda por expresiones regulares es genial, pero no la necesito para este problema
  • Mis archivos binarios son grandes (3.5Gb), por lo que me gustaría evitar leer todo el archivo en la memoria si es posible.

Podrías usar strings para esto:

strings -a -t x filename | grep foobar

Probado con binutils GNU.

Por ejemplo, donde en /bin/ls produce --help :

strings -a -t x /bin/ls | grep -- --help

Salida:

14938 Try `%s --help'' for more information. 162f0 --help display this help and exit


Quería hacer la misma tarea. Aunque cuerdas | grep funcionó, encontré que gsar era la herramienta que necesitaba.

http://tjaberg.com/

La salida se ve como:

>gsar.exe -bic -sfoobar filename.bin filename.bin: 0x34b5: AAA foobar BBB filename.bin: 0x56a0: foobar DDD filename.bin: 2 matches found


grep --byte-offset --only-matching --text foobar filename

La opción --byte-offset imprime el desplazamiento de cada línea coincidente.

La --only-matching hace que se imprima el desplazamiento para cada instancia coincidente en lugar de cada línea coincidente.

La opción --text hace que grep trate el archivo binario como un archivo de texto.

Puedes acortarlo a:

grep -oba foobar filename

Funciona en la versión GNU de grep , que viene con Linux por defecto. No funcionará en BSD grep (que viene con Mac por defecto).