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

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

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

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

  • Невозможно перечислить каталог изнутри, только извне
  • Почему JFS так неясна?
  • Возврат последнего записанного файла, содержащий определенную подстроку в имени файла?
  • динамическая файловая система с крючками
  • Могу ли я создать новый раздел из свободного пространства внутри раздела, отформатированного в reiserfs / home?
  • «Inode_size (128) * inodes_count (0) слишком большой для файловой системы с 0 блоками» при создании файловой системы
  • Как я могу создать каталог «черная дыра» / dev / null?
  • Как владелец файла и группа запоминаются для внешнего диска?
  • 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 - лучшая ОС в мире.