Auf einem Linux-Desktop (RHEL4) möchte ich einen Bereich von Bytes (normalerweise weniger als 1000) aus einer großen Datei (> 1 Gig) extrahieren. Ich kenne den Versatz in der Datei und die Größe des Blocks.
Ich kann dazu Code schreiben, aber gibt es eine Befehlszeilenlösung?
Im Idealfall so etwas wie:
magicprogram --offset 102567 --size 253 < input.binary > output.binary
status=none
, um die Ausgabe an stderr zu unterdrücken.dd if=in.bin bs=1 status=none skip=$((0x88)) count=$((0x80)) of=out.bin
.Dies ist eine alte Frage, aber ich möchte eine weitere Version des
dd
Befehls hinzufügen, die für große Byte-Blöcke besser geeignet ist:wo
$offset
und$bytes
sind Zahlen in Byteeinheiten.Der Unterschied zu Thomas 'akzeptierter Antwort besteht darin, dass sie
bs=1
hier nicht angezeigt wird.bs=1
Die Eingabe- und Ausgabeblockgröße beträgt 1 Byte, was es sehr langsam macht, wenn die Anzahl der zu extrahierenden Bytes groß ist.quelle
iflag
ist ein unbekannter Operand und ohne ihn erhalten Sie einen ganzen Block.dd
kann zuriflag
Unterstützung verwendet werden (brew install coreutils
). Hinweis: Standardmäßig werden die Dienstprogramme mit einemg
Präfix (z. B.gdd
anstelle vondd
) installierthead -c
+tail -c
Ich bin mir nicht sicher, wie es mit der
dd
Effizienz verglichen werden soll, aber es macht Spaß:wählt 3 Bytes ab dem 2. aus:
Siehe auch: https://stackoverflow.com/a/1272995/895245
quelle
printf '\x01\x02' > f
und aushd
.Der Befehl dd kann all dies tun. Sehen Sie sich die Such- und / oder Sprungparameter als Teil des Anrufs an.
quelle
Noch schneller
quelle
skip
in Einheiten vonbs
.req_offset=$(bc <<< "$offset/$bs")
und sicherstellen, dass sich ein runder Wert ergibt.