Comando Linux para recuperar um intervalo de bytes de um arquivo

12

Eu sei que head e tail podem usar a opção -c para especificar um deslocamento de bytes. Estou procurando uma maneira de extrair com eficiência um intervalo de bytes de um arquivo de log grande.

    
por Ramon 11.07.2012 / 16:45

4 respostas

15

O DareDevil dos comandos Unix, dd para o resgate!

dd if=yourfile ibs=1 skip=200 count=100

Isso iniciaria a partir do byte 200 e mostrará 100 bytes seguintes, ou em outras palavras, bytes 200-300. ibs significa que o dd apenas lê um byte de cada vez, em vez dos 512 bytes padrão, mas ainda grava em blocos padrão de 512 bytes. Vá e veja se ibs prejudica o desempenho, espero que não.

    
por 11.07.2012 / 16:58
9

Se o seu interesse estiver nos bytes, od será mais interessante.

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

Então, para ler os 16 bytes começando no byte 1024, e saída em ascii

od -j 1024 -N 16 -a /bin/sh
    
por 11.07.2012 / 16:58
4

Você pode usar dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks (possivelmente com bs=1 para obter blocos de um byte, caso contrário, ele usa blocos de 512 bytes). Não tenho certeza de como é eficiente dizer a ele para escrever um byte de cada vez.

    
por 11.07.2012 / 16:54
1

Assumindo que o arquivo não seja excessivamente grande (por exemplo, vários GB ou mais), o piping de um para o outro é tão eficiente quanto você conseguirá, além de escrever seu próprio programa para fazer isso.

head ... file | tail ...

(Ou o contrário. Seja qual for.)

    
por 11.07.2012 / 16:49