Afficher le nom de file au début de chaque ligne lorsque plusieurs files sont stockés en même time?

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}

Réponse courte

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 ...

Plus d'explications

  • L'option --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