$ dd if=big_file.bin skip=1750 ibs=1MB count=10 of=big_file.bin.part
Você pode querer passar algum tempo lendo e entendendo o dd.
Eu tenho um enorme arquivo de log de cerca de 3,5 GB e gostaria de amostrar seções aleatórias no meio de, digamos, 10 MB com o propósito de depurar o que meu aplicativo está fazendo.
Eu poderia usar os comandos head ou tail para obter o começo ou fim do arquivo, como eu posso pegar uma parte arbitrária do meio do arquivo? Eu acho que eu poderia fazer algo como head -n 1.75GB | tail -n 10MB
, mas isso parece desajeitado e eu preciso determinar os números de linha para o ponto médio do arquivo para obter contagens de linha de 1.75GB e 10MB.
Você pode usar tail, mas especificar um byte offset.
tail -c +$START_BYTE $file | head -c $LENGTH > newfile
Dessa forma, a cauda pode pular diretamente para o ponto de partida (sem contar novas linhas) e, assim que a cabeça coincide com o comprimento correto, ela pára de funcionar.
Você só precisa escrever um pequeno programa para procurar algum local aleatório e ler algumas linhas.
Um exemplo em Python (lê uma linha, mas você pode modificá-la):
def get_random_line():
"""Return a randomly selected line from a file."""
import random
fo = open("/some/file.txt")
try:
point = random.randrange(fo.size)
fo.seek(point)
c = fo.read(1)
while c != '\n' and fo.tell() > 0:
fo.seek(-2, 1)
c = fo.read(1)
line = fo.readline().strip()
finally:
fo.close()
return line