2013-01-03 11 views
20

Sto generando file di dati binari che sono semplicemente una serie di record concatenati insieme. Ogni record è costituito da un'intestazione (binaria) seguita da dati binari. All'interno dell'intestazione binaria c'è una stringa ascii lunga 80 caratteri. Da qualche parte lungo la strada, il mio processo di scrittura dei file è un po 'incasinato e sto cercando di risolvere il problema controllando quanto a lungo sia effettivamente ogni record.offset "grep" della stringa ascii da file binario

This sembra estremamente correlato, ma non capisco perl, quindi non sono stato in grado di ottenere la risposta accettata lì per funzionare. L'altra risposta punta a bgrep che ho compilato, ma mi vuole dare da mangiare una stringa esadecimale e preferirei avere uno strumento in cui posso dargli la stringa ascii e la troverà nei dati binari, stampa la stringa e il byte offset dove è stato trovato.

In altre parole, sto cercando qualche strumento che agisce in questo modo:

tool foobar filename 

o

tool foobar < filename 

e la sua uscita è qualcosa di simile:

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

per esempio la stringa che corrisponde e un offset di byte nel file in cui è iniziata la corrispondenza. In questo esempio, posso dedurre che ogni record è lungo 400 byte.

Altri vincoli:

  • Capacità di ricerca per regex è cool, ma io non ne hanno bisogno per questo problema
  • I miei file binari sono grandi (3,5 GB), quindi mi piacerebbe evitare di leggere l'intero file in memoria, se possibile.
+0

argv! Non so a che punto la mia padronanza della grammatica inglese sia scivolata nel fango. Grazie per averlo corretto per me @Kevin – mgilson

risposta

23

Si potrebbe utilizzare strings per questo:

strings -a -t x filename | grep foobar 

testato con GNU binutils.

Ad esempio, dove nel /bin/ls fa --help verifica:

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

uscita:

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

Ho finito per usare 'strings -a -t d nomefile | grep foobar' per scrivere l'output in decimale anziché in esadecimale. Altrimenti, ottima risposta che sembra funzionare con diversi sapori di 'grep'. – mgilson

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

I --byte-offset opzione consente di stampare l'offset di ciascun linea corrispondente.

L'opzione --only-matching consente di stampare l'offset per ogni istanza corrispondente anziché ogni riga corrispondente.

L'opzione --text rende grep il file binario come un file di testo.

Si può ridurre a:

grep -oba foobar filename 

Funziona nella versione GNU di grep, che viene fornito con Linux di default. Non funzionerà in grep BSD (che viene fornito con Mac di default).

+0

Ho provato questo, tutto ciò che dice è: 'Corrispondenze nome file file binario'. Il mio sistema è Ubuntu Linux, e 'grep -version' dà:" GNU grep 2.5.2 " – mgilson

+1

Prova ad aggiungere l'opzione' -a' per trattare i file binari come testo –

+0

Cheers, che funziona (con '-a'). +1. – mgilson

0

Volevo fare lo stesso compito. Sebbene stringhe | grep ha funzionato, ho trovato che gsar era lo strumento di cui avevo bisogno.

http://tjaberg.com/

L'output appare come:

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