Наличие байтового смещения для файла.
Есть ли инструмент, который дает номер строки для этого байта?
- Количество байтов, начинающееся с нуля, как в: первый байт 0, а не 1.
- Номер строки начинается с 1.
- Файл может иметь как простой текст, так и двоичные двоичные объекты, многобайтовые символы и т. Д. Но интересующий меня раздел: Конец файла, имеет только ASCII.
Пример, файл:
001
002
003 <<-- first zero on this line is byte 8
004
Наличие байтового смещения 8
, которое даст мне строку 3
.
Думаю, я мог бы использовать что-то вроде этого, чтобы найти номер строки:
а. tail -c+(offset + 1) file | wc -l
, здесь, +1
как tail
считается из 1.
б. wc -l file
с. Тогда tail -n+num
где num
находитсяa - b + 1
Но ... есть ли довольно распространенный инструмент, который может дать мне num
напрямую?
Правка, ошибка: или более очевидное:
head -c+offset file | wc -l
text-processing
utilities
user367890
источник
источник
0x0a
байтами.:echo byte2line(offset+1)
.vim -b
иvim
+set binary
+ открыть файл он был поврежден. (Ах. Внезапно я вспоминаю, какой плагин все испортил). Но, во всяком случае, поскольку я использую это в пакетах и в сочетании с целым рядом сценариев, Vim был заброшен рано. Но +1 в любом случае.0xa
где угодно. Понятие строк в двоичном файле не имеет смысла.Ответы:
В вашем примере
байт номер 8 - это вторая новая
0
строка , а не следующая строка.Следующее даст вам количество полных строк после
$b
байтов:Он сообщит
2
сb
установленным на 8, и это сообщит1
сb
установленным на 7.dd
Утилита, как он используется здесь, будет читать из файлаdata.in
, и будет читать$b
блоки размером 1 байт.Как справедливо указывает «Икар» в комментариях ниже, использование
bs=1
неэффективно. В данном конкретном случае эффективнее поменять местамиbs
иcount
:Это будет иметь тот же эффект, что и первая
dd
команда, но будет считывать только один блок$b
байтов.В
wc
утилите подсчитывает новые строки, и «линия» в Unix всегда завершаются символом новой строки. Таким образом, вышеприведенная команда все равно скажет,2
если вы установитеb
значение меньше 12 (следующий символ новой строки). Поэтому результат, который вы ищете, - это любое число вышеуказанных конвейерных отчетов плюс 1.Очевидно, это также подсчитает случайные символы новой строки в части двоичного двоичного файла вашего файла, которая предшествует тексту ASCII. Если вы знали, где начинается бит ASCII, вы можете добавить
skip="$offset"
вdd
команду$offset
число байтов, которое нужно пропустить в файл.источник
head: unknown option -- c
$(( b - 1 ))
.В настоящее время нет такого специализированного инструмента, хотя это довольно легко сделать в python:
Использование простое:
Тестовый забег:
Это очень быстрый и простой скрипт. Он не проверяет, является ли файл пустым или нет, поэтому он работает только с непустыми файлами.
источник
Отслеживайте увиденные байты и выдайте текущий номер строки, если данное смещение будет в пределах суммы:
Или в длину:
источник
perl -0nE exp
глотает ввод в$_
и выполняет expsubstr(string,0,8)
выбирает первые 8 байтовy/\n//
удаляет\n
и возвращает его номеристочник