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

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

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

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

  • Получить полный каталог $ file
  • Почему высокие коды выхода на Linux-оболочках (> = 256) работают не так, как ожидалось?
  • Попытка понять .bashrc, env и export
  • Как удалить файл с именем «>»?
  • SIGINT обрабатывает различия между bash 3 и 4
  • Чтение переменных без bash из файла в скрипт bash
  • Почему переменная видима в подоболочке?
  • Любой способ показать каждый шаг во время обработки команды?
  • 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 намного быстрее и еще лучше

    Interesting Posts

    Определить дубликаты блоков текста в файле

    Ограничьте пропускную способность отдельных HTTP-запросов, не ограничивая общую пропускную способность

    Как узнать, что мой процессор поддерживает 64-битные операционные системы под Linux?

    Автозаполнение аргумента Bash

    Петля игнорирует изменение переменной из подоболочки в фоновом режиме

    USB LABEL на другом языке

    Убедитесь, что debian / control Build-Depends: требования выполняются при обращении пакетов

    NAT не работает должным образом в Linux 2.6.30

    как получить полный аргумент командной строки, переданный процессу в системах unix / linux?

    Исполняемый файл, находящийся в местоположении A, как запустить его в местоположении B?

    Параметр `isolcpus` ядра не влияет на рабочий стол Ubuntu 16.04

    Как переименовать файл в unix с помощью символов в имени файла?

    добавить ключ к proc / keys

    Ответы от многоадресной рассылки 255.255.255.255

    Перезапустить rsyslog после синхронизации времени NTP

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