Я хочу найти дату, которая находится где-то в журнале 8 ГБ (текст).
Могу ли я несколько обойти полное последовательное чтение и сначала выполнить двоичное разбиение файла (размер) или каким-либо образом перемещаться по файловой системе inodes
(о которой я очень мало знаю ), чтобы начать чтение с каждой точки разделения, пока не найду подходящее смещение от с чего начать мой текстовый поиск строки, содержащей дату?
tail
чтение последней строки не использует обычное последовательное чтение, поэтому мне интересно, доступна ли эта возможность в bash, или мне нужно использовать Python или C / C ++ ... но меня особенно интересует bash
опция ..
bash
filesystems
text-processing
Peter.O
источник
источник
Ответы:
которая .. не создает файлов временного разделения, пропускает блоки * 512 МБ данных при каждом запуске, считывает 64 байта из этой позиции и ограничивает вывод первой строкой из этих 64 байтов.
Вы можете настроить 64 на то, что вам нужно.
источник
dd
для этого ... Это отличный инструмент! :)Похоже, вы хотите:
или любое количество байтов, которое вы хотите пропустить. Знак плюс говорит хвосту измерять от начала файла вместо конца. Если вы используете GNU-версию tail, вы можете написать это как:
Чтобы получить фиксированное количество байтов после вырезки, вместо всего остального файла, просто передайте его через заголовок:
источник
dd
переходит к определенному байту (как и делаетtail
), но это кодирование боли с неизвестной длиной строки, а затем вызов sed для удаления начальных частичных строк ... Похоже, что tail | head может сделать это безболезненно (так быстро?) , Я не понимаю, как голова может закрыть кран на хвосте, но, похоже, так оно и есть :). Это должно быть так: если голова перестает получать, хвост прекращает посылку (и прекращает дальнейшее чтение). Должен пойти .. завтра.tail
/head
также не могут слепо угадать длину строки. Вы должны перейти к позиции х, а затем вы можете посмотреть влево или вправо от х для следующего\n
. не имеет значения, как называется программа. Итак, в обоих случаях вы переходите к x, а затем используете,head
чтобы посмотреть направо для следующего конца строки.tail|head
предлагает возможность вообще не беспокоиться по поводуdd
count = val. С 'dd', если я не получаю достаточно данных, это "игра окончена". Гибкость произвольных длин линий велика. Я написал функцию для 'dd', которая возвращает «следующую ближайшую» полную строку и ее смещение, но я бы предпочел избежать проблемы длины. Я сейчас проверил tail | head, и он изначально хорошо работает (для смещения = 100 МБ), но резко замедляется, чтобы занять 2 минуты для одного доступа со смещением = 8 ГБ (я могу сделатьawk
это за 1 минуту) ... так что это здорово за файл меньшего размера .. Спасибо, чтоЯ бы попробовал что-то вроде этого, чтобы разбить журнал на 512MiB куски для более быстрого анализа.
Если вы ищете файл, будет работать следующее:
Используйте этот вывод, чтобы определить, какой файл grep для вашей даты.
источник
Вот мой сценарий, я ищу первую строку, в которой первое поле соответствует моему номеру. Строки отсортированы по первому полю. Я использую dd для проверки первой строки блоков 128K, затем перехожу к блоку и выполняю поиск. Это повышает эффективность файла более 1М.
Любые комментарии или исправления приветствуются!
* EDIT * ** Grep гораздо быстрее и извед еще лучше
источник