Décalage d'octets pour un fichier.
Existe-t-il un outil qui donne le numéro de ligne pour cet octet?
- Nombre d'octets commençant par zéro, comme dans: le premier octet est 0 et non 1.
- Numéro de ligne commençant par 1.
- Le fichier peut avoir à la fois du texte brut, des blobs "binaires", des caractères multi-octets, etc. Mais la section qui m'intéresse: Fin du fichier, n'a que ASCII.
Exemple, fichier:
001
002
003 <<-- first zero on this line is byte 8
004
Avoir un décalage d'octet 8
qui me donnerait une ligne 3
.
Je suppose que je pourrais utiliser quelque chose comme ça pour trouver le numéro de ligne:
une. tail -c+(offset + 1) file | wc -l
, ici +1
pour tail
1.
b. wc -l file
c. Alors tail -n+num
où num
esta - b + 1
Mais ... existe-t-il un outil assez courant qui peut me donner num
directement?
Modifier, errer: ou le plus évident:
head -c+offset file | wc -l
text-processing
utilities
user367890
la source
la source
0x0a
octets.:echo byte2line(offset+1)
.vim -b
etvim
+set binary
+ fichier ouvert, il a été corrompu. (Ah. Soudain, je me souviens quel plugin le gâche). Mais, de toute façon, comme je l'utilise par lots et en combinaison avec une gamme de scripts, Vim a été abandonné très tôt. Mais +1 quand même.0xa
n'importe où. Le concept de lignes dans un fichier binaire n'a pas de sens.Réponses:
Dans votre exemple,
l'octet numéro 8 est le deuxième saut de ligne, pas celui
0
de la ligne suivante.Ce qui suit vous donnera le nombre de lignes complètes après
$b
octets:Il fera rapport
2
avec unb
ensemble à 8 et il fera un rapport1
avec unb
ensemble à 7.L'
dd
utilitaire, tel qu'il est utilisé ici, lira le fichierdata.in
et lira les$b
blocs de taille 1 octet.Comme le souligne à juste titre "icarus" dans les commentaires ci-dessous, l'utilisation
bs=1
est inefficace. Il est plus efficace, dans ce cas particulier, d'échangerbs
etcount
:Cela aura le même effet que la première
dd
commande, mais ne lira qu'un seul bloc d'$b
octets.L'
wc
utilitaire compte les sauts de ligne et une "ligne" sous Unix se termine toujours par un saut de ligne. Ainsi, la commande ci-dessus indiquera toujours2
si vous définissezb
une valeur inférieure à 12 (la nouvelle ligne suivante). Le résultat que vous recherchez est donc le nombre de rapports de pipeline ci-dessus, plus 1.Cela comptera évidemment aussi les sauts de ligne aléatoires dans la partie binaire blob de votre fichier qui précède le texte ASCII. Si vous saviez où le bit ASCII commence, vous pouvez ajouter
skip="$offset"
à ladd
commande, où$offset
est le nombre d'octets à passer dans le fichier.la source
head: unknown option -- c
$(( b - 1 ))
.Actuellement, il n'y a pas d'outil dédié comme ça, bien que cela puisse être fait assez facilement en python:
L'utilisation est simple:
Essai:
Ceci est un script très rapide et simple. Il ne vérifie pas si le fichier est vide ou non, il ne fonctionne donc que sur les fichiers non vides.
la source
Suivez les octets vus et émettez le numéro de ligne actuel si le décalage donné est dans la somme:
Ou longuement:
la source
perl -0nE exp
pénètre l'entrée dans$_
et exécute expsubstr(string,0,8)
sélectionne les 8 premiers octetsy/\n//
supprime le\n
et renvoie son numérola source