Com deslocamento de bytes para um arquivo.
Existe uma ferramenta que fornece o número da linha para este byte?
- Contagem de bytes começando com zero, como em: primeiro byte é 0 e não 1.
- Número da linha começando com 1.
- O arquivo pode ter texto simples, blobs "binários", caracteres multibyte etc. Mas a seção em que estou interessado: Fim do arquivo, possui apenas ASCII.
Exemplo, arquivo:
001
002
003 <<-- first zero on this line is byte 8
004
Tendo byte offset 8
que me daria linha 3
.
Acho que eu poderia usar algo assim para encontrar o número da linha:
uma. tail -c+(offset + 1) file | wc -l
, aqui +1
como tail
conta a partir de 1.
b. wc -l file
c. Então tail -n+num
onde num
estáa - b + 1
Mas ... existe uma ferramenta bastante comum que possa me fornecer num
diretamente?
Editar, errar: ou o mais óbvio:
head -c+offset file | wc -l
text-processing
utilities
user367890
fonte
fonte
0x0a
bytes.:echo byte2line(offset+1)
.vim -b
evim
+set binary
+ arquivo aberto ele foi corrompido. (Ah. De repente, lembro-me de qual plugin estraga tudo). Mas, de qualquer maneira, como eu uso isso em lotes e em combinação com uma variedade de scripts, o Vim foi abandonado cedo. Mas +1 de qualquer maneira.0xa
qualquer lugar. O conceito de linhas em um arquivo binário não tem sentido.Respostas:
No seu exemplo,
o byte número 8 é a segunda nova linha, não
0
a próxima linha.A seguir, será fornecido o número de linhas completas após
$b
bytes:Ele reportará
2
comb
definido como 8 e reportará1
comb
definido como 7.O
dd
utilitário, da maneira como é usado aqui, lerá o arquivodata.in
e lerá$b
blocos de tamanho 1 byte.Como "icarus" corretamente aponta nos comentários abaixo, o uso
bs=1
é ineficiente. É mais eficiente, nesse caso específico, trocarbs
ecount
:Isso terá o mesmo efeito que o primeiro
dd
comando, mas lerá apenas um bloco de$b
bytes.O
wc
utilitário conta novas linhas, e uma "linha" no Unix sempre é encerrada por uma nova linha. Portanto, o comando acima ainda dirá2
se você definirb
algo menor que 12 (a nova linha a seguir). O resultado que você está procurando é, portanto, qualquer que seja o número dos relatórios de pipeline acima, mais 1.Obviamente, isso também contará as novas linhas aleatórias na parte de blob binário do seu arquivo que precede o texto ASCII. Se você soubesse onde o bit ASCII é iniciado, você pode adicionar
skip="$offset"
aodd
comando onde$offset
está o número de bytes a serem pulados no arquivo.fonte
head: unknown option -- c
$(( b - 1 ))
.Atualmente, não existe uma ferramenta dedicada como essa, embora possa ser feita com bastante facilidade em python:
O uso é simples:
Execução de teste:
Este é um script muito rápido e simples. Ele não verifica se o arquivo está vazio ou não, portanto, funciona apenas em arquivos não vazios.
fonte
Rastreie os bytes vistos e emita o número da linha atual, se o deslocamento especificado estiver dentro da soma:
Ou longamente:
fonte
perl -0nE exp
insere a entrada$_
e executa expsubstr(string,0,8)
seleciona os primeiros 8 bytesy/\n//
remove o\n
e retorna seu númerofonte