Как подключить несколько файлов, используя 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

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

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


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.


@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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.