Cách cắt đuôi nhiều tệp bằng đuôi -0f trong Linux / AIX


39

Tôi đã thử điều chỉnh hai tập tin bằng cách sử dụng tùy chọn:

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

Trong Linux, tôi thấy một lỗi "đuôi: chỉ có thể xử lý một tệp tại một thời điểm".

Trong AIX tôi thấy lỗi là "Tùy chọn không hợp lệ".

Điều này hoạt động tốt khi tôi sử dụng:

tail -f file1 -f file 2

trong Linux nhưng không có trong AIX.

Tôi muốn có thể theo đuôi nhiều tệp bằng -0fhoặc -ftrong AIX / Linux

multitail không được công nhận trong một trong hai hệ điều hành này.


Bạn đã thử sử dụng screenđể tạo hai phiên khác nhau? Bạn có thể sử dụng đuôi trên cả hai màn hình? Ngoài ra, tmuxcó thể thực hiện công việc là tốt nếu bạn đã cài đặt nó.
ryekayo

Câu trả lời:


36

Thế còn:

tail -f file1 & tail -f file2

Hoặc tiền tố mỗi dòng với tên của tệp:

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

Để theo dõi tất cả các tệp có tên khớp với một mẫu, bạn có thể triển khai tail -f(đọc từ tệp mỗi giây liên tục) với một zshtập lệnh như:

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

Sau đó, ví dụ, để theo dõi tất cả các tệp văn bản trong thư mục hiện tại theo cách đệ quy:

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

1
bất kỳ lý do để thích sedcách trên &đường?
gilad mayani

@giladmayani Tôi chỉ đang thử nghiệm điều này nhưng vấn đề với & cách mà tôi tìm thấy là nếu bạn gói nó trong một kịch bản, bạn sẽ nhận được các quy trình ma không thoát.
Matthieu Cormier

8

tailnhiều tệp được mở rộng bằng phiên bản đuôi GNU. Với AIX, bạn không có đuôi GNU, vì vậy bạn không thể làm điều đó. Bạn có thể sử dụng multitailthay thế.

Bạn có thể cài đặt multitail trong cả Linux và AIX.

  • Với AIX, bạn có thể tải gói tại đây .

  • Trong Linux, multitailthường là repo, vì vậy bạn có thể dễ dàng cài đặt nó bằng trình quản lý gói distro:

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

1
Đa nhiệm hoạt động tốt và cú pháp rất đơn giản:multitail -i path/to/file1 -i path/to/file2
Housemd

6

Điều sau đây hoạt động tốt để xuất ra những thứ trên std out

tail -f file1 & tail -f file2

Tôi muốn pipeđầu ra cho một quá trình khác. Trong trường hợp trên &là tạo phần trước khi nó chạy trong nền và chỉ có phần thứ hai được pipedxử lý

vì vậy tôi đã sử dụng

tail -f file1 file2 | process

@ Stéphane câu trả lời của bạn là hoàn hảo, nhưng chỉ cần đề cập đến trường hợp sử dụng của tôi có một chút thay đổi.


Vấn đề là tail -f file1 file2nó không hoạt động trên AIX khi đuôi chỉ chấp nhận một tên tệp. Bạn có thể làm (tail -f file1 & tail -f file2) | processđể chuyển hướng thiết bị xuất chuẩn của cả hai tailsang đường ống đến process.
Stéphane Chazelas

5

Trong OSX và Linux, sử dụng

tail -f <file1> <file2>

làm việc tuyệt vời cho tôi Một điều tốt đẹp nữa là nó có đầu ra sau:

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

để giúp bạn nhận ra đầu ra nào từ bản ghi đó.


1
thêm qvào để thay thế các tiêu đề
Karl Pokus

1

Tôi sẽ cung cấp một đoạn mã bằng cách sử dụng tmuxcó thể cung cấp cho bạn hai cửa sổ khác nhau mà bạn có thể sử dụng để theo đuôi cả hai tệp cùng một lúc:

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

CẬP NHẬT: Sử dụng screencũng có thể đính kèm / tách nhiều phiên để bạn có thể chạy tailnhiều lần. Tôi có thể đề nghị làm điều này:

screen -s Tail_Server1.log

Tiếp theo, bạn sẽ muốn giữ CTRL+A+Dđể dettach mà không giết các phiên và tiếp theo:

screen -s Tail_Server2.log

Cả hai sẽ chạy hai phần riêng biệt screens, tôi sẽ tham khảo để screen --helpbạn có thể điều chỉnh nó theo cách bạn muốn cả hai màn hình hoạt động trên terminal.


@WebNash hãy tận hưởng :)
ryekayo

@WebNash câu trả lời của tôi có hiệu quả với những gì bạn hỏi không?
ryekayo

0

Sau đây làm việc cho tôi trên SunOS 5.10.

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

Cả hai đuôi sẽ chạy trong nền. Các thay đổi đối với các tệp sẽ được ném vào thiết bị xuất chuẩn. Hơn nữa, bạn có thể chạy bất kỳ lệnh nào ở giữa chỉ bằng cách nhấn enter.


... nhưng điều đó tạo ra hai quá trình mà bạn phải tiêu diệt và trộn STDOUT với đầu ra nền trước.
bắt đầu từ

0

Sử dụng oneliner sau đây:

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

Cứ sau 1 giây, tập lệnh sẽ in 10 dòng cuối cùng của luồng được lọc.

Để phá vỡ vòng lặp, nhấn CtrlC.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.