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.
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).