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

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

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

  • Подскажите пароль sudo и программно повысите привилегию в скрипте bash?
  • Как заменить текст после определенного слова с помощью sed?
  • есть ли способ установить раскраску для вкладки cd?
  • Как открыть несколько файлов из `find`?
  • Как проверить, находится ли элемент в массиве bash?
  • Как определить, экспортированы ли переменные оболочки или нет?
  • tail читает последнюю строку, не использует нормальное последовательное чтение, поэтому я задаюсь вопросом, доступно ли это средство в bash или мне нужно использовать Python или C / C ++ … но меня особенно интересует опция bash ..

  • Поиск Failed attemps в / var / log / secure
  • Проблема пунктуации с использованием grep для получения n слов вокруг токена
  • Control-p задерживает сеанс SSH
  • Переименовать несколько каталогов, уменьшающих порядковый номер?
  • basename не работает должным образом
  • Навигация по CLI: верните N слов
  • 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 - лучшая ОС в мире.