So stellen Sie mit tail -0f unter Linux / AIX die Tail-Funktion für mehrere Dateien bereit


39

Ich habe versucht, zwei Dateien mit der folgenden Option zu bearbeiten:

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

Unter Linux wird der Fehler "tail: kann jeweils nur eine Datei verarbeiten" angezeigt.

In AIX sehe ich den Fehler als "Ungültige Optionen".

Das funktioniert gut, wenn ich benutze:

tail -f file1 -f file 2

unter Linux, aber nicht unter AIX.

Ich möchte in der Lage sein, mehrere Dateien mit -0foder -funter AIX / Linux zu verwalten

multitail wird in keinem dieser Betriebssysteme erkannt.


Haben Sie versucht screen, zwei verschiedene Sitzungen zu erstellen? Sie sollten in der Lage sein, Schwanz auf beiden Bildschirmen zu verwenden? Auch tmuxkann die Arbeit machen und wenn Sie es installiert haben.
Ryekayo

Antworten:


36

Wie wäre es mit:

tail -f file1 & tail -f file2

Oder stellen Sie jeder Zeile den Namen der Datei voran:

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

Um alle Dateien zu verfolgen, deren Name mit einem Muster übereinstimmt, können Sie das Skript tail -f(das jede Sekunde kontinuierlich aus der Datei liest) zshwie folgt implementieren :

#! /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

Um dann beispielsweise alle Textdateien im aktuellen Verzeichnis rekursiv zu verfolgen:

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

1
Gibt es einen Grund, den sedWeg dem &Weg vorzuziehen ?
Gilad Mayani

@ Giladmayani Ich experimentiere nur damit, aber das Problem mit der & Art und Weise, die ich gefunden habe, ist, dass, wenn Sie es in ein Skript einbinden, Sie Geisterprozesse bekommen, die nicht beendet werden.
Matthieu Cormier

8

tailMehrere Dateien werden um die GNU-Tail-Version erweitert. Unter AIX haben Sie kein GNU-Tail, also können Sie es nicht tun. Sie können multitailstattdessen verwenden.

Sie können Multitail sowohl unter Linux als auch unter AIX installieren .

  • Unter AIX können Sie das Paket hier herunterladen .

  • multitailIst unter Linux häufig in repo, sodass Sie es einfach mit dem Distributionspaket-Manager installieren können:

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

1
Multitail funktioniert gut und die Syntax ist einfach:multitail -i path/to/file1 -i path/to/file2
Housemd

6

Folgendes funktioniert gut, um Dinge auf Standardausgabe auszugeben

tail -f file1 & tail -f file2

Ich wollte pipedie Ausgabe auf einen anderen Prozess umstellen. In obigem Fall &wurde das Teil gemacht, bevor es im Hintergrund lief und nur der zweite Teil pipedzu verarbeiten war

also habe ich benutzt

tail -f file1 file2 | process

@Stéphane Deine Antwort ist perfekt, aber ich erwähne nur meinen Anwendungsfall, der eine kleine Wendung hat.


Der Punkt ist, dass tail -f file1 file2es unter AIX nicht funktioniert, wenn tail nur einen Dateinamen akzeptiert. Sie können tun (tail -f file1 & tail -f file2) | process, um die Standardausgabe von beiden tails an die Pipe weiterzuleiten process.
Stéphane Chazelas

5

Unter OSX und Linux mit

tail -f <file1> <file2>

funktioniert super bei mir Eine andere nette Sache ist, dass es die folgende Ausgabe hat:

==> /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

um zu erkennen, welche Ausgabe aus welchem ​​Protokoll stammt.


1
hinzufügen q, um die Header zu unterdrücken
Karl Pokus

1

Ich werde ein Code-Snippet zur Verfügung stellen tmux, das Ihnen zwei verschiedene Fenster bietet, mit denen Sie beide Dateien gleichzeitig bearbeiten können:

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

UPDATE: Mit screenkönnen Sie auch mehrere Sitzungen verbinden / trennen, sodass Sie auch tailmehrere Male ausgeführt werden können. Ich kann dies vorschlagen:

screen -s Tail_Server1.log

Als nächstes möchten Sie sich CTRL+A+Dzurückziehen, ohne die Sitzungen zu beenden, und dann weiter:

screen -s Tail_Server2.log

Beides wird zwei Mal separat ausgeführt screens, ich verweise darauf, screen --helpdamit Sie es so einstellen können, wie Sie möchten, dass beide Bildschirme auf Ihrem Bildschirm funktionieren terminal.


@WebNash genießen :)
Ryekayo

@WebNash hat meine Antwort für das funktioniert, was Sie gefragt haben?
Ryekayo

0

Das Folgende funktioniert für mich unter SunOS 5.10.

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

Beide Schwänze laufen im Hintergrund. Die Änderungen an Dateien werden auf stdout geworfen. Darüber hinaus können Sie jeden Befehl zwischendurch ausführen, indem Sie die Eingabetaste drücken.


... aber das schafft zwei Prozesse, die Sie beenden müssen, und mischt STDOUT mit der Vordergrundausgabe.
20.08.17

0

Verwenden Sie den folgenden Oneliner:

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

Alle 1 Sekunde druckt das Skript 10 letzte Zeilen des gefilterten Streams.

Drücken Sie, um die Schleife zu unterbrechen CtrlC.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.