Перебор очень длинных строк в огромном файле - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в сценариях оболочки. Я пытаюсь перебрать файлы журналов в среде Linux с помощью сценария оболочки. Вот мой код:

while read p; do
 head=${p:0:250}
 #some code here#
done < ./log.txt

Я беру только первые 250 символов в переменную для обработки в цикле. Строки в файле журнала могут быть огромными, а сам файл - почти 5 ГБ. Когда я запускаю приведенный выше код в нескольких строках, я получаю следующую ошибку:

 xrealloc: cannot allocate 18446744071562068080 bytes (36864 bytes allocated)

Есть ли способ, которым я могу получить только часть строки вместо всей строки во время итерации? или есть какой-то другой лучший способ добиться того, что я пытаюсь сделать?

EDIT: Когда я запускаю скрипт с -x, я вижу, что скрипт некоторое время останавливается на read p, а затем я получаю сообщение об ошибке. Я думаю, что он пытается загрузить всю строку, прежде чем продолжить, и это вызывает проблему.

Я присваиваю первые 250 символов переменной ($head), чтобы впоследствии можно было разбить эту переменную на массив и выполнить некоторые операции при выполнении итерации по этому массиву. Мне не нужна переменная, пока я могу получить доступ к первым 250 символам из строки.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 26 июня 2018

Сокращение содержимого до первых 250 символов в каждой строке лучше всего выполнить перед тем, как войти в цикл оболочки. Вы можете сделать это, сохраняя состояние из переменных, установленных в цикле, с помощью процесса подстановки :

#!/usr/bin/env bash

while IFS= read -r p; do
  : put your code for processing "$p" here
done < <(cut -c -250 ./log.txt)

См. BashFAQ # 1 , в котором обсуждаются причины IFS= и read -r и BashFAQ # 24 , чтобы получить более подробную информацию о том, почему замена процесса здесь выгодна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...