Коротка відповідь
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
чоловічої сторінки :
--tagstring str
Рядки з тегом рядком. Кожен вихідний рядок буде попередньо встановлений
str та TAB (\ t). str може містити рядки заміни, такі як {}.
--tagstring ігнорується при використанні -u, --onall та --nonall.
Усі входження {}
буде замінено аргументами паралельних, які в даному випадку є іменами файлів журналу; тобто one.log
і two.log
(всі аргументи після :::
).
Цей параметр --line-buffer
необхідний, оскільки виведення команди (наприклад, tail -f one.log
або tail -f two.log
) буде надруковано, якщо ця команда буде закінчена. Оскільки tail -f
буде чекати зростання файлів, потрібно надрукувати результат на рядковій основі, що --line-buffer
так і робиться. Знову зі parallel
сторінки man :
- лінійний буфер (альфа-тестування)
Буферний вихід на основі ліній. --group збереже вихід
разом за цілу роботу. --група дозволяє виводити суміш з вихідними
половина рядка, що йде від однієї роботи, і половина лінії, що надходить
інша робота. - лінія буфера підходить між цими двома: паралель GNU
надрукує повний рядок, але дозволить змішувати лінії
різні робочі місця.
-v
(багатослівний) варіант хвоста. Це може не відповідати вашому запиту, але це початок.