Возможно ли в bash начать чтение файла из смещения счетчика байтов?

Я хочу найти дату, которая находится где-то в журнале объемом 8 ГБ (текст).

Могу ли я несколько обойти полное последовательное чтение и сначала сделать двоичные расщепления файла (размер) или каким-то образом перейти к файловой системе inodes (о которой я очень мало знаю), чтобы начать чтение из каждой точки разделения, пока не найду подходящее смещение откуда начать мой текстовый поиск строки, содержащей дату?

tail читает последнюю строку, не использует нормальное последовательное чтение, поэтому я задаюсь вопросом, доступно ли это средство в bash или мне нужно использовать Python или C / C ++ … но меня особенно интересует опция bash ..

  • Существуют ли широко распространенные файловые системы, которые представляют каталоги со структурами, оптимизированными для быстрого поиска?
  • Какие точки монтирования существуют в типичной системе Linux?
  • Где хранится информация о жестких / непрямых ссылках?
  • Загрузите копию файла, который обновляется при изменении
  • пакетное переименование файлов
  • как устранить неполадки в том, действительно ли файловая система была размонтирована или нет.?
  • Файловые системы и разделы
  • Разрешения по пути вместо битов режима файла
  • 4 Solutions collect form web for “Возможно ли в bash начать чтение файла из смещения счетчика байтов?”

     for (( block = 0; block < 16; block += 1 )) do echo $block; dd if=INPUTFILE skip=$((block*512))MB bs=64 count=1 status=noxfer 2> /dev/null | \ head -n 1 done 

    который .. не создает файлы с временным разделением, пропускает блоки * 512 Мбайт данных при каждом запуске, считывает 64 байта из этой позиции и ограничивает вывод в первую строку из этих 64 байтов.

    вы можете настроить 64 на все, что вам кажется нужным.

    Похоже, вы хотите:

     tail -c +1048576 

    или любое количество байтов, которое вы хотите пропустить. Знак плюса говорит хвосту для измерения от начала файла, а не до конца. Если вы используете версию хвоста GNU, вы можете написать это как:

     tail -c +1M 

    Чтобы получить фиксированное количество байтов после разреза, вместо всего остального файла просто пропустите его через голову:

     tail -c +1048576 | head -c 1024 

    Я бы попробовал что-то вроде этого, чтобы разбить журнал на куски 512MiB для более быстрого разбора.

     split <filename> -b 536870912 

    Если вы ищете файл, он будет работать:

     for file in x* ; do echo $file head -n 1 $file done 

    Используйте этот вывод, чтобы определить, какой файл grep для вашей даты.

    Вот мой сценарий, я ищу первую строку, первое поле соответствует моему числу. Строки сортируются в соответствии с первым полем. Я использую dd для проверки первой строки блоков из 128K, затем я перехожу к блоку и выполняю поиск. Это повышает эффективность, так как файл превышает 1M.

    Любые комментарии или исправления приветствуются!

     #!/bin/bash search=$1; f=$2; bs=128; max=$( echo $(du $f | cut -f1)" / $bs" | bc ); block=$max; for i in $(seq 0 $max); do n=$(dd bs=${bs}K skip=$i if=$f 2> /dev/null| head -2 | tail -1 | cut -f1) if [ $n -gt $search ]; then block=`expr $i - 1` break; fi done; dd bs=${bs}K skip=$block if=$f 2> /dev/null| tail -n +2 | awk -v search="$search" '$1==search{print;exit 1;};$1>search{exit 1;};'; 

    * EDIT * ** grep намного быстрее и еще лучше

    Linux и Unix - лучшая ОС в мире.