Se eu tiver um arquivo binário, ou algum comando com uma saída binária bruta, e estou procurando um comando shell (bash) para cortar uma parte específica dos dados, ou seja, com determinado início e comprimento ou deslocamento final em bytes.
Por exemplo, suponha que file.bin
contém abcdefghijk
, eu faria algo como:
cat file.bin | crop 5 3
Para indicar que quero manter apenas a parte do deslocamento 5 com comprimento 3, para que este exemplo produza fgh
.
Eu sei que existe o cut
comando, mas ele funciona no conteúdo do texto e processa a entrada linha por linha. No meu caso, normalmente estou lidando com dados binários, portanto, não há conceito de linhas. Eu simplesmente quero especificar a parte a ser cortada em bytes.
Existe uma alternativa binária para cut
?
dd
vai fazer isso. Se você precisar de uma granularidade de um byte, deverá definir o tamanho do bloco para 1:cat file.bin | dd bs=1 skip=5 count=3
POSIX
tail
com-c
pode manipular dados arbitrários. Infelizmente POSIXhead
não pode. Quando limitado a POSIX, você precisa dedd
; quer assim:Ou assim:
bs=1
pode ser sub-ótimo, mas mesmo que seuskip=
ecount=
possa ser recalculado para um valor maiorbs=
, somente com POSIX é adequado para vocêdd
bs=1
.dd
Suportes GNUiflag=fullblock
que podem ajudar em caso de maioresbs=
. No seu caso com o GNU,dd
uma opção melhor éiflag=skip_bytes,count_bytes
:O comando acima usa o padrão
bs=512
e funciona apesar do fato de que nem 5 nem 3 são múltiplos de 512. O comando deve funcionar com qualquer sanebs=
.Se o seu
head
suporte-c
para contar bytes, provavelmente não aguardará uma linha completa ao ler neste modo. Isso leva ao seguinte método:Pode haver outras soluções. Observe se
command1
imprime os primeiros 5 bytes de sua entrada ecommand2
imprime os primeiros 3 bytes de sua entrada entãopode ou não funcionar. Em geral
command1
pode ler mais de 5 bytes (e ainda imprimir 5 em seu stdout), então aocommand2
iniciar a leitura, o ponteiro pode estar no lugar errado. Os comandos que dei a você não seguem esse padrão potencialmente falho.