“Grep-ing” de A para B na saída do hexdump

3

Aqui está a situação: Eu tenho que encontrar na saída de um hexdump os bytes entre uma string A e uma string B. A estrutura do hexdump é algo como:

-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes

E agora, as perguntas: - É possível grep "de A para B"? Eu não vi nada assim na man page ou na internet. Eu sei que posso fazer isso manualmente, mas eu preciso fazer o script. - É possível mostrar a saída hexdump sem os números de linha? Parece muito razoável, mas não encontrei o caminho para fazê-lo.

Obrigado!

Editar: Estou tentando recuperar 2 imagens JPEG excluídas de um dispositivo de loopback, por isso não posso mostrar toda a saída (é extremamente longa), mas aqui está uma parte:

0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
[...]
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00

o padrão diz que os arquivos JPEG começam com 0xff 0xd8 e terminam com 0xFF 0xd9, então eu quero pegar todas as informações entre as duas strings (acho que isso deve funcionar, mas ainda não testei)

    
por Palantir 08.05.2012 / 19:35

3 respostas

2

Pode ser uma ideia melhor manter isso estritamente binário, conforme mencionado aqui bbe parece ser a ferramenta para o trabalho. O comando a seguir grava JPEGs para zerar arquivos numéricos preenchidos.

bbe -s -b '/\xff\xd8/:/\xff\xd9/' -e 'w %05B.jpg' > /dev/null
    
por 08.05.2012 / 21:57
1

não testado

awk '
  /ff d8/ || ($2 == "d8" && ff_prevline) {p = 1}
  p {print}
  /ff d9/ || ($2 == "d9" && ff_prevline) {p = 0}
  {ff_prevline = ($NF == "ff")}
'
    
por 08.05.2012 / 19:58
1

Uma maneira de usar perl . Ele produzirá apenas esse intervalo de bytes entre ff 8d e ff 9d , sem números de linha:

Supondo os próximos dados como o conteúdo de infile :

0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00

Executar próximo perl one-liner:

perl -ne '
    if ( (my $start = m/ff\sd8/) .. (my $end = m/ff\sd9/) ) { 
        s/\S*\s//; 
        s/\A.*(?=ff\sd8)// if $start; 
        s/(?<=ff\sd9).*\Z// if $end; 
        print 
    }
' infile

Isso fornecerá a seguinte saída:

ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01                                                                                                                                                                                              
00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a                                                                                                                                                                                              
3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32                                                                                                                                                                                              
e8 26 8f ff d9
    
por 08.05.2012 / 21:33

Tags