Короткий ответ
В GNU Parallel есть множество приятных опций, которые позволяют очень легко делать такие вещи:
parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log
Выход будет:
one.log: содержимое one.log здесь ...
one.log: содержимое one.log здесь ...
two.log: содержимое файла two.log здесь ...
two.log: содержимое файла two.log здесь ...
Больше объяснений
- Опция
--tagstring=str
помечает каждую строку вывода строкой str . Изparallel
man-страницы :
--tagstring str
Строки тегов со строкой. Каждая строка вывода будет дополнена
ул и таб (\ т). str может содержать замещающие строки, такие как {}.
--tagstring игнорируется при использовании -u, --onall и --nonall.
Все вхождения {}
будут заменены аргументами параллели, которые в данном случае являются именами файлов журнала; т.е. one.log
и two.log
(все аргументы после :::
).
Опция --line-buffer
обязательна, потому что вывод команды (например, tail -f one.log
или tail -f two.log
) будет напечатан, если эта команда завершена. Так как tail -f
будет ждать роста файла, необходимо распечатать вывод в виде строки, что --line-buffer
делает это. Снова из parallel
справочной страницы :
--line-buffer (альфа-тестирование)
Вывод буфера на линейной основе. --group сохранит вывод
вместе для всей работы. --ungroup позволяет смешивать вывод с
половина строки от одной работы и половина строки от
другая работа. --line-buffer подходит между этими двумя: GNU параллельно
напечатает полную строку, но позволит смешивать строки
разные работы.
-v
(подробный) вариант хвоста. Это может не совсем соответствовать вашему запросу, но это только начало.