Byte-Offset für eine Datei.
Gibt es ein Tool, das die Zeilennummer für dieses Byte angibt?
- Byteanzahl beginnend mit Null, wie in: Das erste Byte ist 0, nicht 1.
- Zeilennummer beginnend mit 1.
- Die Datei kann sowohl einfachen Text als auch "binäre" Blobs, Multibyte-Zeichen usw. enthalten. Der Abschnitt, an dem ich interessiert bin: Dateiende, enthält jedoch nur ASCII.
Beispiel, Datei:
001
002
003 <<-- first zero on this line is byte 8
004
Ein Byte-Offset 8
, der mir eine Zeile geben würde 3
.
Ich schätze, ich könnte so etwas verwenden, um die Zeilennummer zu finden:
ein. tail -c+(offset + 1) file | wc -l
, Hier +1
als tail
Zählungen von 1.
b. wc -l file
c. tail -n+num
Wo num
ist dann ?a - b + 1
Aber ... gibt es ein ziemlich verbreitetes Werkzeug, das mir num
direkt zur Verfügung stehen kann?
Bearbeiten, äh: oder das offensichtlichere:
head -c+offset file | wc -l
text-processing
utilities
user367890
quelle
quelle
0x0a
Bytes getrennt sind .:echo byte2line(offset+1)
.vim -b
undvim
+set binary
+ geöffneter Datei wurde es beschädigt. (Ah. Plötzlich erinnere ich mich, welches Plugin es vermasselt). Aber trotzdem, da ich dies in Stapeln und in Kombination mit einer Reihe von Skripten verwende, wurde Vim früh aufgegeben. Aber trotzdem +1.0xa
überall sein. Das Konzept der Zeilen in einer Binärdatei ist bedeutungslos.Antworten:
In Ihrem Beispiel
Byte Nummer 8 ist die zweite neue Zeile, nicht die
0
in der nächsten Zeile.Im Folgenden erhalten Sie die Anzahl der vollständigen Zeilen nach
$b
Bytes:Es wird
2
mitb
Satz auf 8 und1
mitb
Satz auf 7 berichtet.Das
dd
Dienstprogramm, wie es hier verwendet wird, liest aus der Dateidata.in
und liest$b
Blöcke mit einer Größe von 1 Byte.Wie "icarus" in den Kommentaren unten zu Recht hervorhebt, ist die Verwendung
bs=1
ineffizient. In diesem speziellen Fall ist es effizienter zu tauschenbs
undcount
:Dies hat den gleichen Effekt wie der erste
dd
Befehl, liest jedoch nur einen$b
Byteblock.Das
wc
Dienstprogramm zählt Zeilenumbrüche und eine "Zeile" in Unix wird immer durch einen Zeilenumbruch abgeschlossen. Der obige Befehl sagt also immer noch aus,2
ob Sie einenb
Wert unter 12 eingestellt haben (die folgende neue Zeile). Das gesuchte Ergebnis ist daher die Anzahl der oben genannten Pipeline-Berichte plus 1.Dies zählt natürlich auch die zufälligen Zeilenumbrüche im binären Blob-Teil Ihrer Datei, der dem ASCII-Text vorausgeht. Wenn Sie wissen, wo das ASCII-Bit beginnt, können Sie
skip="$offset"
demdd
Befehl hinzufügen , wo$offset
die Anzahl der Bytes ist, die in die Datei gesprungen werden sollen.quelle
head: unknown option -- c
$(( b - 1 ))
.Derzeit gibt es kein solches dediziertes Tool, obwohl es in Python ziemlich einfach ausgeführt werden kann:
Die Verwendung ist einfach:
Testlauf:
Dies ist ein sehr schnelles und einfaches Skript. Es wird nicht überprüft, ob die Datei leer ist oder nicht, daher funktioniert es nur bei nicht leeren Dateien.
quelle
Verfolgen Sie die angezeigten Bytes und geben Sie die aktuelle Zeilennummer aus, falls der angegebene Versatz innerhalb der Summe liegt:
Oder ausführlich:
quelle
perl -0nE exp
schlürft die Eingabe in$_
und führt exp aussubstr(string,0,8)
wählt die ersten 8 Bytes ausy/\n//
entfernt das\n
und gibt seine Nummer zurückquelle