Sua descrição não combina bem com o hexdump fornecido, já que todos os segundos bytes após ed
são 00
. No entanto, você deve tentar dominar pelo menos uma das ferramentas mais sofisticadas do Unix para manipulação de strings, ou seja, awk
.
Você pode simplificar seu fluxo de dados, colocando exatamente um número hexadecimal por linha. Com o seu exemplo, você pode canalizá-lo através de tr -s ' ' '\n'
. No entanto, mais útil se você fizer man hexdump
você pode ver que fornece opções no formato de saída para imprimir um número por linha, para que você não precise manipulá-lo ainda mais. Por exemplo
hexdump -v -e '1/1 "%02x\n"'
fornecerá dados como
2f
ed
3f
00
08
canaliza os dados para esse script
awk '$1=="ed" {
getline byte1
getline byte2
number = strtonum("0x" substr(byte2,2,1))
print "len is " number
data = byte1 byte2
while(number-->0){getline byte; data = data byte}
print data
} '
Isto verifica se a primeira palavra na linha é ed
, então usa getline
para ler a próxima linha na variável byte1, e a linha depois em byte2. O substr()
pega o último caractere, concatena com "0x" e chama strtonum
para converter o hexa em decimal. O loop while
chama getline esse número de vezes e concatena os dados.