如何在Linux / AIX中使用tail -0f尾部多个文件


39

我尝试使用选项将两个文件拖尾:

tail -0f file1.log -0f file2.log

在Linux中,我看到一个错误“ tail:一次只能处理一个文件”。

在AIX中,我将错误视为“无效选项”。

当我使用时,这工作正常:

tail -f file1 -f file 2

在Linux中而不在AIX中。

我希望能够使用-0f-f在AIX / Linux中拖尾多个文件

multitail 这些操作系统中的任何一个都无法识别。


您是否尝试过用来screen创建两个不同的会话?您应该可以在两个屏幕上都使用尾巴吗?另外,tmux如果已安装,也可以完成该工作。
ryekayo 2014年

Answers:


36

关于什么:

tail -f file1 & tail -f file2

或在每行前面加上文件名:

tail -f file1 | sed 's/^/file1: /' &
tail -f file2 | sed 's/^/file2: /'

要跟踪所有名称与模式匹配的文件,可以tail -f使用以下zsh脚本实现(连续每秒从文件读取):

#! /bin/zsh -
zmodload zsh/stat
zmodload zsh/zselect
zmodload zsh/system
set -o extendedglob

typeset -A tracked
typeset -F SECONDS=0

pattern=${1?}; shift

drain() {
  while sysread -s 65536 -i $1 -o 1; do
    continue
  done
}

for ((t = 1; ; t++)); do
  typeset -A still_there
  still_there=()
  for file in $^@/$~pattern(#q-.NoN); do
    stat -H stat -- $file || continue
    inode=$stat[device]:$stat[inode]
    if
      (($+tracked[$inode])) ||
        { exec {fd}< $file && tracked[$inode]=$fd; }
    then
      still_there[$inode]=
    fi
  done
  for inode fd in ${(kv)tracked}; do
    drain $fd
    if ! (($+still_there[$inode])); then
      exec {fd}<&-
      unset "tracked[$inode]"
    fi
  done
  ((t <= SECONDS)) || zselect -t $((((t - SECONDS) * 100) | 0))
done

然后,例如,以递归方式跟踪当前目录中的所有文本文件:

that-script '**/*.txt' .

1
有什么理由喜欢sed这种&方式吗?
吉拉德·马亚尼

@giladmayani我只是在尝试这个问题,但是我发现的&方式的问题是,如果将其包装在脚本中,将会得到不退出的虚幻进程。
Matthieu Cormier,

8

tailGNU tail版本扩展了多个文件。使用AIX,您没有GNU尾部,因此您无法做到这一点。您可以multitail改用。

您可以在Linux和AIX中都安装multitail

  • 使用AIX,您可以在此处下载软件包。

  • 在Linux中,multitail通常是回购,因此您可以使用发行版软件包管理器轻松安装它:

    • 在Debian / Ubuntu中: apt-get install multitail
    • 在Centos / Fedora中: yum install multitail

1
多尾效果很好,语法也很简单:multitail -i path/to/file1 -i path/to/file2
Housemd

6

下面的东西可以很好地在std out上输出东西

tail -f file1 & tail -f file2

我想pipe将输出输出到另一个进程。在上述情况下,&是在零件在后台运行之前制作零件,而只有第二个零件piped要处理

所以我用

tail -f file1 file2 | process

@Stéphane,您的答案是完美的,但仅提及我的用例,它有点曲解。


关键是,tail -f file1 file2在tail只接受一个文件名的AIX上不起作用。您可以(tail -f file1 & tail -f file2) | process将两个tail的标准输出重定向到管道到process
斯特凡Chazelas

5

在OSX和Linux中,使用

tail -f <file1> <file2>

对我来说很棒。另一个好处是它具有以下输出:

==> /srv/www/my-app/shared/log/nginx.access.log <==
things from log 1

==> /srv/www/my-app/shared/log/nginx.error.log <==
things from log 2

==> /srv/www/my-app/shared/log/nginx.access.log <==
new things from log 1

帮助您识别哪个输出来自哪个日志。


1
添加q抑制页眉
Karl Pokus

1

我将提供一个使用的代码片段tmux,它可以为您提供两个不同的窗口,您可以使用它们同时尾随两个文件:

tmux new-window -a -n Tail
tmux new-session -d -s Tail -n SSH0 -d
tmux selectp -t Tail

#This is tmux interactions with the user (colors of the tabs used, hot keys, etc.)
tmux bind-key -n M-Left previous-window -t WinSplit
tmux bind-key -n M-Right next-window -t WinSplit
tmux set-window-option -g monitor-activity on
tmux set -g visual-activity on
tmux set-window-option -g window-status-current-bg blue
tmux set-window-option -g window-status-fg red
tmux set -g pane-border-fg yellow
tmux set -g pane-active-border-bg red
tmux set -g message-fg yellow
tmux set -g message-bg red
tmux set -g message-attr bright
tmux set -g status-left "#[fg=red]#S"

#Names two seperate windows
tmux new-window -n tail1 -t Tail
tmux new-window -n tail2 -t Tail

#Now this will allow you to automatically run tail when this tmux script is run
tmux send-keys -t Tail:0 'tail -f file1.log' C-m
tmux send-keys -t Tail:1 'tail -f file2.log' C-m

更新:使用screen还可以附加/分离多个会话,因此您也可以运行tail多次。我可以建议这样做:

screen -s Tail_Server1.log

接下来,您将想要按住CTRL+A+D而不中断会话,然后继续:

screen -s Tail_Server2.log

两者将分别运行screens,我将参考它们,screen --help以便您可以调整它以使两个屏幕都能在您的屏幕上工作terminal


@WebNash enjoy :)
ryekayo 2014年

@WebNash我的答案对您的要求有用吗?
ryekayo

0

以下在SunOS 5.10上对我有用。

$ tail -f file1.log &
$ tail -f file2.log &
$ 

两条尾巴都将在后台运行。对文件的更改将被扔到stdout。此外,您可以通过按回车键在两者之间运行任何命令。


...但是这将创建两个进程,您必须杀死它们并将STDOUT与前景输出混合。
mpower

0

使用以下oneliner:

while true; do cat /path/to/numerous/folders/and/files/*/*.txt | grep "some filter" | tail -n 10; sleep 1; done

每1秒钟,脚本将打印过滤后的流的最后10行。

要中断循环,请按CtrlC

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.