Назад | Перейти на главную страницу

Как записать в файл и, пока файл все еще записывается, прочитать и проанализировать его содержимое с помощью сценария оболочки?

На самом деле я пытаюсь написать сценарий оболочки, который записывает вывод команды в файл, но, поскольку выполнение команды занимает много времени (около 15 минут), я хотел бы начать синтаксический анализ вывода команды (content файла) до завершения команды, поэтому я могу отправлять сообщения на стандартный вывод (пользователю), например:

10% complete
45% complete

и так далее.

Шаги программы

  1. Перенаправить команду в файл: $ (команда)> $ FILE
  2. Начните читать и анализировать вывод ($ FILE) до завершения команды.

Я думал об использовании параллельного программирования, но не разбирался в этом.

Я действительно решил проблему, используя tail и вопрос о переполнении стека Завершение tail -f, запущенного в сценарии оболочки.

# Solution
($(command) > ${FILE}) &
tail -f --pid=$! ${FILE} | while read line
do
      echo $line
      # Can parse each line output here
      # Example: send errors to log file
      if echo $line | grep -qi "error"
      then
            echo $line >> ${LOG}
      fi
done

Спасибо всем за помощь.

Используйте tail и вставьте его в свой парсер.

Трубы, тройник и хвост (тройник - центральная часть вопроса, поскольку он дублировал стандартный вывод. Если бы файл sed был тем файлом, который вы использовали для анализа данных, примером был бы такой:

kbrandt@k$ a=0; while [[ a -lt 10 ]]; do
> echo foo; a=$(( $a + 1));
> done | tee -a unprocessed | sed 's/foo/bar/' > processed
kbrandt@kbrandt$ cat unprocessed 
foo
foo
foo
...
kbrandt@kbrandt$ cat processed 
bar
bar
...

Затем вы можете запустить его как задание и обработать хвост, или просто tail -f processed в другом окне.

хвост -f будет следовать файл в момент его создания.

попробуйте это с файлом журнала.

tail -f / var / log / messages например.

вы увидите файл журнала, выводимый на консоль, как он появляется в журнале.