Как подключить несколько файлов, используя tail -0f в Linux / AIX

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

Ответы:

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вместо этого.

Вы можете установить multitail как в Linux, так и в AIX.

  • С AIX вы можете скачать пакет здесь .

  • В Linux multitailчасто находится в репо, поэтому вы можете легко установить его с помощью диспетчера пакетов distro:

    • В Debian / Ubuntu: apt-get install multitail
    • В Centos / Fedora: yum install multitail
cuonglm
источник
1
Многоэтажный работает хорошо, и синтаксис прост:multitail -i path/to/file1 -i path/to/file2
Housemd
6

Следующая вещь работает нормально, чтобы вывести вещи на стандартный вывод

tail -f file1 & tail -f file2

Я хотел pipeвывод на другой процесс. В вышеприведенном случае &делали часть до того, как она запустилась в фоновом режиме, и только вторая часть pipedобрабатывала

поэтому я использовал

tail -f file1 file2 | process

@ Стефан, твой ответ идеален, но я только упомянул мой вариант использования, который немного искажает.

Смущенный
источник
Дело в том, что tail -f file1 file2не работает в AIX, где tail принимает только одно имя файла. Вы можете сделать, (tail -f file1 & tail -f file2) | processчтобы перенаправить стандартный вывод обоих tails в канал process.
Стефан Шазелас
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

чтобы помочь вам узнать, какой вывод из какого журнала.

mpowered
источник
1
добавить, qчтобы подавить заголовки
Карл Покус
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.

ryekayo
источник
@WebNash наслаждайтесь :)
Ryekayo
@WebNash сработал ли мой ответ на то, что вы спросили?
ryekayo
0

Следующее работает для меня на SunOS 5.10.

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

Оба хвоста будут работать в фоновом режиме. Изменения в файлах будут отправлены на стандартный вывод. Кроме того, вы можете запустить любую команду между ними, просто нажав Enter.

Рагху Содха
источник
... но это создает два процесса, которые вам нужно убить, и смешивает 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.

KiriSakow
источник