как заменить во время чтения LINE - PullRequest
1 голос
/ 28 сентября 2011

Я написал скрипт для печати определенных дней из файла журнала! скрипт работает нормально, но я записал часть цикла с при чтении строки , а файл журнала содержит более 150000 элементов! скрипт хочет читать его построчно, и это занимает часы! так что время должно быть изменено каким-то образом! Я знаю о for в {1..N}, но я хочу что-то лучшее, что работает для любого файла журнала.

что вы предлагаете?

1 Ответ

1 голос
/ 29 сентября 2011

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

За ваш комментарий '... Я должен нажать Enter для каждой строки, которую нужно прочитать'.Вы определенно делаете что-то не так.Чтение каждой строки должно быть автоматическим.Вот основные принципы обработки файлов с помощью bash.

Рассматриваете ли вы использовать awk?Я могу опубликовать лучшие решения с помощью этого стандартного инструмента.

 inputFiles="${@}"
 cat "${inputFiles}"\
 | while read line ; do
     case ${line} in
        2[0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]* ) 
            # matched date
             print ${line}
        ;;
        * )
            # you'll need to add other reg-expes here to extract data you want
        ;;
      esac
 done

Возможно, вам придется удалить dbl-кавычки на ${inputFiles}.

Цель использования cat ${inputfiles | while read line ... - разрешить обработкулюбые файлы, которые вы перечисляете в командной строке.

Вы пытались использовать grep для просмотра ваших файлов журналов?

 date1='2011-09-11' ; date2='2011-09-12'; date3='2011-09-13'
 grep "${date1}|${date2}|${date3}" *.logFiles | grep -i error

Вы также можете использовать дату1 ... в качестве цели вприведенный выше цикл while.

 case ${line} in
   ${date1}*|${date2}*|${date3}* )
      echo $line
   ;;
 esac

Вы можете убрать '*' выше ИЛИ, если дата НЕ является первым элементом в строке, вам может потребоваться добавить '*'перед каждым ${dateN}.

Или, если вы храните ваши файлы в сжатом виде,

 gunzip -c ${zippedLogFiles_gz) | grep "${date1}|${date2}|${date3}" | grep -i error

часто является хорошим местом для начала (и только распаковывает ваши файлы на месте(просто отправив несжатый вывод в канал)).

PS, поскольку вы выглядите новым пользователем, если вы получите ответ, который поможет вам, не забудьте пометить его как принятый и / или дать ему+ (или -) в качестве полезного ответа.

...