Разбор Perl большой Ожидайте вывода перед записью в файл - PullRequest
1 голос
/ 06 декабря 2011

Я создаю программу для опроса сетевого устройства каждые 48 часов и записи выходного пользователя Perl и модуля Expect.На данный момент я сохраняю выводимый текст в текстовый файл, а затем фильтрую текстовый файл, чтобы получить необходимую информацию.Первоначально это было хорошо, так как эффективность не была такой большой проблемой при работе с файлом размером всего в сотню КБ и сохранением большей части текста в любом случае, но я нашел новую команду, которую хочу выполнить удаленно насетевое устройство.Эта команда занимает полтора часа, создает текстовый файл размером около 5 МБ, и я, вероятно, буду хранить только 10 КБ информации.Использование базового файлового ввода-вывода (чтение текстового файла, запись в текстовый файл) просто кажется плохой идеей, и я продолжаю думать, что должен быть лучший способ.

То, что мои исследования оказались такдалеко: я, наверное, должен использовать какой-то трубе.Что-то вроде:

<code>open($filehandle, "myCommand");
Существуют и другие решения, но они, похоже, подразумевают, что я сохраняю ВСЁ файл в одну переменную, когда я хотел бы сохранить и изменить только его части перед записью в файл.TIEHANDLE хорошо работает для переопределения «печати», но я не думаю, что это необходимо или будет работать здесь.

То, что я пробовал до сих пор: перенаправление STDOUT с использованием канала.Результат: сохранил отправку вывода в файл и не смог отредактировать текст до того, как он был помещен в файл.

У меня кончились вещи в Google.Если полное решение слишком устрашает задачу, нам также будет очень полезен совет о том, где могут быть следующие шаги.

Кроме того, если преимущества с точки зрения времени обработки на самом деле минимальны (янеясно, сколько времени потребуется для обработки 5 МБ тестового файла и будет ли оно расследоваться), пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Perl может быстро обработать файл размером 5 МБ, я не буду беспокоиться о попытке перенаправить вывод в канал, когда вы можете просто открыть файл и проанализировать его, как только ваша работа будет завершена.

    open(INPUT, "/path/to/file.log") or die "Can't open file: $!";

    while (<INPUT>) {
    chomp;
      if (/ERROR/) {
        print "Found an error!";
      }
    }
    close(INPUT);
    exit;

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

Надеюсь, это поможет ...

0 голосов
/ 06 декабря 2011

В зависимости от вашей версии Perl, вы можете сделать:

open(my $fh, "-|", command => @command_arguments) or die "Error: $!";
while (<$fh>) {
  # Process output of command
}
close $fh or die "Error: $!";

На более старых версиях (я думаю, 5.6 или более ранних) вы можете сделать:Расскажите из своего поста, действительно ли вам нужен Expect.Если вам просто нужно выполнить команду и перехватить вывод, то все будет хорошо.

...