Tener desplazamiento de bytes para un archivo.
¿Existe alguna herramienta que proporcione el número de línea para este byte?
- Recuento de bytes que comienza con cero, como en: primer byte es 0 no 1.
- Número de línea que comienza con 1.
- El archivo puede tener texto sin formato, blobs "binarios", caracteres multibyte, etc. Pero la sección que me interesa: Fin del archivo, solo tiene ASCII.
Ejemplo, archivo:
001
002
003 <<-- first zero on this line is byte 8
004
Tener un byte offset 8
me daría una línea 3
.
Supongo que podría usar algo como esto para encontrar el número de línea:
a. tail -c+(offset + 1) file | wc -l
, aquí +1
como tail
cuenta desde 1.
b. wc -l file
C. Entonces tail -n+num
donde num
estaa - b + 1
Pero ... ¿hay una herramienta bastante común que me pueda dar num
directamente?
Editar, err: o lo más obvio:
head -c+offset file | wc -l
text-processing
utilities
usuario367890
fuente
fuente
0x0a
bytes.:echo byte2line(offset+1)
.vim -b
yvim
+set binary
+ archivo abierto se corrompió. (Ah. De repente recuerdo qué plugin lo estropea). Pero, de todos modos, cuando uso esto en lotes y en combinación con una variedad de guiones, Vim fue abandonado temprano. Pero de todos modos +1.0xa
cualquier lugar. El concepto de líneas en un archivo binario no tiene sentido.Respuestas:
En tu ejemplo
El byte número 8 es la segunda línea nueva, no la
0
línea siguiente.Lo siguiente le dará el número de líneas completas después de los
$b
bytes:Informará
2
con elb
conjunto a 8 e informará1
con elb
conjunto a 7.La
dd
utilidad, como se usa aquí, leerá el archivodata.in
y leerá$b
bloques de 1 byte.Como "icarus" señala correctamente en los comentarios a continuación, el uso
bs=1
es ineficiente. Es más eficiente, en este caso particular, intercambiarbs
ycount
:Esto tendrá el mismo efecto que el primer
dd
comando, pero leerá solo un bloque de$b
bytes.La
wc
utilidad cuenta nuevas líneas, y una "línea" en Unix siempre termina con una nueva línea. Por lo tanto, el comando anterior aún dirá2
si establece un valorb
inferior a 12 (la siguiente nueva línea). El resultado que está buscando es, por lo tanto, cualquier número que indique la tubería anterior, más 1.Obviamente, esto también contará las nuevas líneas aleatorias en la parte de blob binario de su archivo que precede al texto ASCII. Si supiera dónde comienza el bit ASCII, puede agregar
skip="$offset"
aldd
comando, dónde$offset
está la cantidad de bytes que se omitirán en el archivo.fuente
head: unknown option -- c
$(( b - 1 ))
.Actualmente no existe una herramienta dedicada como esa, aunque se puede hacer con bastante facilidad en python:
El uso es simple:
Prueba de funcionamiento:
Este es un script muy rápido y simple. No comprueba si el archivo está vacío o no, por lo que funciona solo en archivos no vacíos.
fuente
Rastree los bytes vistos y emita el número de línea actual en caso de que el desplazamiento dado esté dentro de la suma:
O por fin:
fuente
perl -0nE exp
sorbe la entrada$_
y ejecuta expsubstr(string,0,8)
selecciona los primeros 8 bytesy/\n//
elimina el\n
y devuelve su númerofuente