Linux-Befehl zum Abrufen eines Bytebereichs aus einer Datei

15

Ich weiß das headund tailkann -coptional einen Byte-Offset angeben. Ich suche nach einer Möglichkeit, einen Byte-Bereich aus einer großen Protokolldatei effizient zu extrahieren.

Ramon
quelle

Antworten:

17

Der Draufgänger der Unix-Befehle ddzur Rettung!

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

Das würde ab Byte 200 beginnen und 100 nächste Bytes oder mit anderen Worten, Bytes 200-300 anzeigen. ibsbedeutet, dass dd nur jeweils ein Byte anstelle der Standard-512-Bytes liest, aber weiterhin in Standard-512-Byte-Chunks schreibt. Gehen Sie und sehen Sie, ob ibsdie Leistung schadet, ich hoffe nicht.

Janne Pikkarainen
quelle
Für eine Datei mit 782090815 Bytes erhalte ich die folgenden Zeiten: 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

Wenn Ihr Interesse an den Bytes liegt, wäre oddas von größerem Interesse.

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

Also die 16 Bytes ab Byte 1024 auslesen und in ASCII ausgeben

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

Sie können verwenden dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(möglicherweise mit bs=1, um Ein-Byte-Blöcke zu erhalten, andernfalls werden 512-Byte-Blöcke verwendet). Ich bin mir nicht sicher, wie effizient es ist, es anzuweisen, jeweils ein Byte zu schreiben.

DerfK
quelle
Nun, besorgt , wenn die Effizienz in Bezug auf - 2 dd‚s kann zusammen Rohr gekettet sein (die ersten könnte fettes Stück geschnitten und die zweite feine Arbeit über das Rohr, nicht Scheibe tun würde), aber ddhat nicht nur , bsaber getrennt ibsund obsals gut, so bei Zumindest könnte es mit größeren Blöcken als Lesen ausgegeben werden.
Poige
1

Vorausgesetzt, die Datei ist nicht übermäßig groß (z. B. mehrere GB oder so), ist das Weiterleiten von einer zur nächsten so effizient wie möglich, abgesehen vom Schreiben eines eigenen Programms.

head ... file | tail ...

(Oder umgekehrt. Egal.)

Ignacio Vazquez-Abrams
quelle
1
Bei großen Offsets sollte tail an erster Stelle stehen, andernfalls wird der Anfang der Kopfausgabe verworfen.
Proski