lorsque vous tuez plusieurs files à la fois comme indiqué ci-dessous, est-il possible d'afficher le nom du file au début de chaque ligne?
tail -f one.log two.log
sortie actuelle
==> one.log <== contents of one.log here... contents of one.log here... ==> two.log <== contents of one.log here... contents of two.log here..
Vous cherchez quelque chose comme
one.log: contents of one.log here... one.log: contents of one.log here... two.log: contents of two.log here... two.log: contents of two.log here...
tail -f ...your-files | awk '/^==> / {a=substr($0, 5, length-8); next} {print a":"$0}'
\ thanks {don_cristti}
GNU Parallel a un set de bonnes options qui rendent très facile de faire de telles choses:
parallel --tagssortingng "{}:" --line-buffer tail -f {} ::: one.log two.log
La sortie serait:
one.log: contenu de one.log ici ... one.log: contenu de one.log ici ... two.log: contenu de two.log ici ... two.log: contenu de two.log ici ...
--tagssortingng=str
marque chaque ligne de sortie avec la string str . De la page de manuel parallel
: --tagssortingng str Marquez les lignes avec une string. Chaque ligne de sortie sera précédée str et TAB (\ t). str peut contenir des strings de rlocation telles que {}. --tagssortingng est ignoré lors de l'utilisation de -u, --onall et --nonall.
Toutes les occurrences de {}
seront remplacées par les arguments de parallélisme qui, dans ce cas, sont des noms de files journaux; à savoir one.log
et two.log
(tous les arguments après :::
two.log
.
L'option --line-buffer
est nécessaire car la sortie d'une command (par exemple tail -f one.log
ou tail -f two.log
) serait imprimée si cette command est terminée. Comme tail -f
attend la croissance du file, il est nécessaire d'imprimer la sortie en ligne, ce qui est le cas de la ligne --line-buffer
. Encore une fois de la page de man parallel
:
--line-buffer (test alpha) Sortie tampon en ligne. --group gardera la sortie set pour un travail complet. --ungroup permet à la sortie de se mélanger avec une demi-ligne provenant d'un travail et une demi-ligne venant de un autre travail. --Ligne-tampon s'adapte entre ces deux: GNU parallèle imprimera une ligne complète, mais permettra de mélanger les lignes de différents emplois.
Si la tail
n'est pas obligatoire, vous pouvez utiliser grep
pour cela:
grep "" *.log
Cela imprimera le nom de file en tant que préfixe de chaque ligne de sortie.
La sortie se casse si *.log
développe à un seul file. À cet égard:
grep '' /dev/null *.log
Mon idée serait de créer un seul file avec des journaux fusionnés à partir de plusieurs files, comme quelqu'un a suggéré ici et préfixer les noms de files:
$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG && $ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG && $ tail -f /tmp/LOG
Quelque chose avec xargs
et sed
pourrait fonctionner:
$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT one.log two.log EOT