No seu exemplo,
001
002
003
004
o número de bytes 8 é a segunda nova linha, não o 0
na linha seguinte.
A seguir, você verá o número de linhas completas após $b
bytes:
$ dd if=data.in bs=1 count="$b" | wc -l
Ele reportará 2
com b
definido como 8 e reportará 1
com b
definido como 7.
O utilitário dd
, como é usado aqui, lerá o arquivo data.in
e lerá $b
blocos de tamanho 1 byte.
Como o "icarus" aponta corretamente nos comentários abaixo, usar bs=1
é ineficiente. É mais eficiente, neste caso específico, trocar bs
e count
:
$ dd if=data.in bs="$b" count=1 | wc -l
Isso terá o mesmo efeito que o primeiro comando dd
, mas lerá apenas um bloco de $b
bytes.
O utilitário wc
conta as novas linhas e uma "linha" no Unix é sempre terminada por uma nova linha. Portanto, o comando acima ainda dirá 2
se você definir b
para algo menor que 12 (a seguinte nova linha). O resultado que você está procurando é, portanto, qualquer número dos relatórios acima, mais 1.
Isso obviamente também contará as novas linhas aleatórias na parte do blob binário de seu arquivo que precede o texto ASCII. Se você soubesse onde o bit ASCII é iniciado, você poderia adicionar skip="$offset"
ao comando dd
, em que $offset
é o número de bytes a serem ignorados no arquivo.