Je le sais head
et je tail
peux prendre l' -c
option pour spécifier un décalage d'octet. Je cherche un moyen d'extraire efficacement une plage d'octets d'un grand fichier journal.
15
Je le sais head
et je tail
peux prendre l' -c
option pour spécifier un décalage d'octet. Je cherche un moyen d'extraire efficacement une plage d'octets d'un grand fichier journal.
Le DareDevil des commandes Unix, dd
à la rescousse!
dd if=yourfile ibs=1 skip=200 count=100
Cela commencerait par l'octet 200 et afficherait les 100 octets suivants, ou en d'autres termes, les octets 200-300. ibs
signifie que dd ne lit qu'un octet à la fois au lieu des 512 octets par défaut, mais écrit toujours en blocs de 512 octets par défaut. Allez voir si cela ibs
nuit à la performance, j'espère que non.
time dd if=file.txt | wc -l
= 00: 00: 03s.time dd if=file.txt ibs=1 count=782090815 | wc -l
= 9:05:19Si votre intérêt est dans les octets, serait
od
plus intéressant.Donc, pour lire les 16 octets à partir de l'octet 1024, et sortir en ascii
la source
Vous pouvez utiliser
dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks
(éventuellement avecbs=1
pour obtenir des blocs d'un octet, sinon il utilise des blocs de 512 octets). Je ne sais pas à quel point il est efficace de lui dire d'écrire un octet à la fois.la source
dd
peuvent être enchaînés ensemble (le 1er pourrait couper le gros morceau et le 2e ferait du bon travail sur le tuyau, pas le disque), maisdd
non seulementbs
mais séparéibs
etobs
aussi, donc à il pourrait au moins produire des blocs plus gros que la lecture.En supposant que le fichier n'est pas excessivement volumineux (par exemple plusieurs Go ou plus), le piping de l'un à l'autre est aussi efficace que possible, à moins d'écrire votre propre programme pour le faire.
(Ou l'inverse. Peu importe.)
la source