Linux / AIXでtail -0fを使用して複数のファイルをテールする方法


39

私はオプションを使用して2つのファイルをテーリングしようとしました:

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

Linuxでは、「tail:一度に1つのファイルしか処理できません」というエラーが表示されます。

AIXでは、エラーが「無効なオプション」として表示されます。

私が使用するとこれはうまくいきます:

tail -f file1 -f file 2

Linuxでは、AIXではない。

AIX / Linux を使用して、-0fまたは-fAIX / Linuxで複数のファイルをテーリングできるようにしたい

multitail これらのOSのいずれでも認識されません。


screen2つの異なるセッションの作成に使用しようとしましたか?両方の画面でtailを使用できるはずですか?また、tmuxインストールされていれば、同様にジョブを実行できます。
リエカヨ14

回答:


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私はこれを試しているだけですが、私が見つけた&方法の問題は、スクリプトでラップすると、終了しないゴーストプロセスが発生することです。
マシューコルミエ

8

tail複数のファイルは、GNUテールバージョンによって拡張されます。AIXでは、GNUテールがないため、実行できません。multitail代わりに使用できます。

LinuxとAIXの両方にマルチテールをインストールできます。

  • AIXでは、ここからパッケージをダウンロードできます。

  • Linuxでは、multitail多くの場合リポジトリにあるため、ディストリビューションパッケージマネージャーを使用して簡単にインストールできます。

    • Debian / Ubuntuの場合: apt-get install multitail
    • Centos / Fedoraの場合: yum install multitail

1
Multitailは素晴らしい作品と構文は単純です:multitail -i path/to/file1 -i path/to/file2
Housemd

6

次のものは、std outで出力するのにうまく機能します

tail -f file1 & tail -f file2

pipe別のプロセスに出力したかった。上記の場合&、バックグラウンドで実行する前にパーツを作成し、2番目のパーツのみpipedを処理していました

だから私は使った

tail -f file1 file2 | process

@Stéphaneはあなたの答えは完璧ですが、ちょっとしたひねりを加えた私のユースケースについて言及しています。


ポイントはtail -f file1 file2、tailが1つのファイル名のみを受け入れるAIXでは機能しないということです。(tail -f file1 & tail -f file2) | process両方tailのの標準出力をにパイプにリダイレクトすることができますprocess
ステファンシャゼル

5

OSXおよびLinuxでは、使用

tail -f <file1> <file2>

私にとっては素晴らしい作品です。もう1つの良い点は、次の出力があることです。

==> /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ヘッダーを
抑制

1

コードスニペットをtmux使用して、両方のファイルを同時にテールするために使用できる2つの異なるウィンドウを提供します。

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

両方とも2つに分離して実行されますので、両方のスクリーンがあなたのマシンscreensで動作するscreen --helpように調整できるように参照しますterminal


@WebNashをお楽しみください:)
ryekayo 14

@WebNashは、あなたが尋ねたものに対して私の答えは機能しましたか?
リエカヨ14

0

以下は、SunOS 5.10で動作します。

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

両方の尾がバックグラウンドで実行されます。ファイルへの変更はstdoutにスローされます。さらに、Enterキーを押すだけで、間にある任意のコマンドを実行できます。


...しかし、2つのプロセスを作成し、それらを強制終了し、STDOUTとフォアグラウンド出力を混合します。
権限付与

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ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.