简短回答

简短回答

当一次拖尾多个文件时,如下所示,有没有办法在每行的开头显示文件名?

tail -f one.log two.log

电流输出

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

寻找类似的东西

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

答案1

简短回答

GNU 并行有一组不错的选项,可以让您轻松执行此类操作:

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用字符串标记每个输出行斯特。从parallel 手册页:
--tagstring 字符串
                用字符串标记行。每个输出行将前面加上
                str 和 TAB (\t)。 str 可以包含替换字符串,例如 {}。

                使用 -u、--onall 和 --nonall 时,--tagstring 将被忽略。
  • 所有出现的 都{}将被并行的参数替换,在本例中,这些参数是日志文件名;即one.logtwo.log(之后的所有参数:::)。

  • 该选项是必需的,因为如果命令完成,将打印命令(例如或)--line-buffer的输出。由于将等待文件增长,因此需要按行打印输出。再次来自tail -f one.logtail -f two.logtail -f--line-bufferparallel 手册页:

--line-buffer(alpha 测试)
                基于行的缓冲输出。 --group 将保留输出
                一起完成整个工作。 --ungroup 允许输出混合
                半行来自一项工作,半行来自
                另一份工作。 --line-buffer 适合这两者:GNU 并行
                将打印整行,但允许混合行
                不同的工作。

答案2

tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\谢谢{don_cristti}

答案3

如果tail不是强制性的,您可以使用grep以下方法来实现:

grep "" *.log

这将打印文件名作为每个输出行的前缀。

如果*.log仅扩展到一个文件,输出将中断。在这方面:

grep '' /dev/null *.log

答案4

我的想法是创建一个包含来自多个文件的合并日志的单个文件,就像有人建议的那样这里并添加文件名:

$ 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

相关内容