Commande Linux pour récupérer une plage d'octets à partir d'un fichier

15

Je le sais headet je tailpeux prendre l' -coption pour spécifier un décalage d'octet. Je cherche un moyen d'extraire efficacement une plage d'octets d'un grand fichier journal.

Ramon
la source

Réponses:

17

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. ibssignifie 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 ibsnuit à la performance, j'espère que non.

Janne Pikkarainen
la source
Pour un fichier de 782090815 octets, j'ai obtenu ces temps: time dd if=file.txt | wc -l= 00: 00: 03s. time dd if=file.txt ibs=1 count=782090815 | wc -l= 9:05:19
Danilo Souza Morães
11

Si votre intérêt est dans les octets, serait odplus intéressant.

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

Donc, pour lire les 16 octets à partir de l'octet 1024, et sortir en ascii

od -j 1024 -N 16 -a /bin/sh
Sirch
la source
4

Vous pouvez utiliser dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(éventuellement avec bs=1pour 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.

DerfK
la source
Eh bien, si vous vous souciez de l'efficacité - les 2 ddpeuvent ê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), mais ddnon seulement bsmais séparé ibset obsaussi, donc à il pourrait au moins produire des blocs plus gros que la lecture.
poige
1

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.

head ... file | tail ...

(Ou l'inverse. Peu importe.)

Ignacio Vazquez-Abrams
la source
1
la queue doit aller en premier pour les grands décalages, sinon le début de la sortie de la tête est ignoré.
proski