Come personalizzare più file usando tail -0f in Linux / AIX


39

Ho provato a mettere in coda due file usando l'opzione:

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

In Linux vedo un errore "tail: può elaborare solo un file alla volta".

In AIX vedo l'errore come "Opzioni non valide".

Funziona bene quando uso:

tail -f file1 -f file 2

in Linux ma non in AIX.

Voglio essere in grado di personalizzare più file usando -0fo -fin AIX / Linux

multitail non è riconosciuto in nessuno di questi sistemi operativi.


Hai provato a utilizzare screenper creare due sessioni diverse? Dovresti essere in grado di usare la coda su entrambi gli schermi? Inoltre, tmuxpuò fare anche il lavoro se lo hai installato.
Ryekayo,

Risposte:


36

Che dire:

tail -f file1 & tail -f file2

O prefisso ogni riga con il nome del file:

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

Per seguire tutti i file il cui nome corrisponde a un modello, è possibile implementare tail -f(che legge continuamente il file ogni secondo) con uno zshscript come:

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

Quindi, ad esempio, seguire ricorsivamente tutti i file di testo nella directory corrente:

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

1
qualche motivo per preferire sedil &passaggio?
Gilad Mayani,

@giladmayani Sto solo sperimentando questo, ma il problema con il modo in cui ho scoperto è che se lo avvolgi in uno script otterrai processi fantasma che non si chiudono.
Matthieu Cormier,

8

tailpiù file sono estesi dalla versione coda GNU. Con AIX, non hai la coda GNU, quindi non puoi farlo. Puoi usare multitailinvece.

È possibile installare il multitail sia in Linux che in AIX.

  • Con AIX, puoi scaricare il pacchetto qui .

  • In Linux, multitailè spesso in repository, quindi puoi installarlo facilmente usando Gestione pacchetti distro:

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

1
Multitail funziona bene e la sintassi è semplice:multitail -i path/to/file1 -i path/to/file2
Housemd

6

La seguente cosa funziona bene per produrre cose su std out

tail -f file1 & tail -f file2

Volevo pipel'output per un altro processo. Nel caso precedente &stava realizzando la parte prima che venisse eseguita in background e solo la seconda parte doveva essere pipedelaborata

così ho usato

tail -f file1 file2 | process

@ Stéphane la tua risposta è perfetta, ma solo menzionando il mio caso d'uso che ha una piccola svolta.


Il punto è che tail -f file1 file2non funziona su AIX dove tail accetta solo un nome file. Puoi fare (tail -f file1 & tail -f file2) | processper reindirizzare lo stdout di entrambe le tails sulla pipe process.
Stéphane Chazelas,

5

In OSX e Linux, usando

tail -f <file1> <file2>

funziona benissimo per me. Un'altra cosa bella è che ha il seguente output:

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

per aiutarti a riconoscere quale output proviene da quale log.


1
aggiungi qper sopprimere le intestazioni
Karl Pokus,

1

Fornirò uno snippet di codice tmuxche può darti due diverse finestre che puoi usare per adattare entrambi i file contemporaneamente:

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

AGGIORNAMENTO: L'uso screenpuò anche collegare / scollegare più sessioni in modo da poter eseguire tailpiù volte. Posso suggerire di fare questo:

screen -s Tail_Server1.log

Successivamente ti consigliamo di tenere premuto CTRL+A+Dper scollegare senza uccidere le sessioni e poi il prossimo:

screen -s Tail_Server2.log

Entrambi eseguiranno due separati screens, vorrei fare riferimento in screen --helpmodo da poterlo regolare su come si desidera che entrambi gli schermi funzionino sul tuo terminal.


@WebNash enjoy :)
ryekayo

@WebNash ha funzionato la mia risposta per quello che hai chiesto?
ryekayo,

0

Di seguito funziona per me su SunOS 5.10.

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

Entrambe le code verranno eseguite in background. Le modifiche ai file verranno lanciate su stdout. Inoltre è possibile eseguire qualsiasi comando tra semplicemente premendo Invio.


... ma questo crea due processi che devi uccidere e mescola STDOUT con l'output in primo piano.
Potenza del

0

Utilizzare il seguente oneliner:

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

Ogni 1 secondo, lo script stamperà le ultime 10 righe del flusso filtrato.

Per interrompere il loop, premere CtrlC.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.