วิธีตัดหลายไฟล์โดยใช้ 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มากกว่า&ทาง?
gilad mayani

@giladmayani ฉันแค่ทดลองกับสิ่งนี้ แต่ปัญหาของ & วิธีที่ฉันพบคือถ้าคุณใส่มันไว้ในสคริปต์คุณจะได้รับกระบวนการผีที่ไม่ออก
Matthieu Cormier

8

tailหลายไฟล์ถูกขยายโดยรุ่นหาง GNU ด้วย AIX คุณไม่มี GNU tail ดังนั้นคุณไม่สามารถทำได้ คุณสามารถใช้multitailแทน

คุณสามารถติดตั้งMultitail ได้ทั้งใน Linux และ AIX

  • ด้วย AIX คุณสามารถดาวน์โหลดแพคเกจที่นี่

  • ใน Linux multitailมักอยู่ใน repo ดังนั้นคุณสามารถติดตั้งได้อย่างง่ายดายโดยใช้ตัวจัดการแพคเกจ distro:

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

1
Multitail ใช้งานได้ดีและไวยากรณ์ง่ายมาก:multitail -i path/to/file1 -i path/to/file2
Housemd

6

สิ่งต่อไปนี้ใช้งานได้ดีกับสิ่งส่งออกที่ std out

tail -f file1 & tail -f file2

ฉันต้องการที่จะpipeส่งออกไปยังกระบวนการอื่น ในกรณีข้างต้น&คือการทำส่วนก่อนที่จะทำงานในพื้นหลังและส่วนที่สองเท่านั้นที่จะถูกpipedดำเนินการ

ดังนั้นฉันใช้

tail -f file1 file2 | process

@ Stéphaneคำตอบของคุณสมบูรณ์แบบ แต่เพียงแค่พูดถึงกรณีการใช้งานของฉันซึ่งมีการบิดเล็กน้อย


ประเด็นคือtail -f file1 file2ไม่สามารถใช้งานได้ใน AIX ที่ tail ยอมรับชื่อไฟล์เดียวเท่านั้น คุณสามารถทำได้(tail -f file1 & tail -f file2) | processเพื่อเปลี่ยนเส้นทาง stdout ของทั้งสองที่จะท่อเพื่อtail process
Stéphane Chazelas

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ส่วนหัว
Karl Pokus

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 --helpterminal


@WebNash เพลิดเพลินไปกับ :)
ryekayo

@WebNash คำตอบของฉันทำงานในสิ่งที่คุณถามหรือไม่
ryekayo

0

งานต่อไปนี้สำหรับฉันใน SunOS 5.10

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

หางทั้งสองจะทำงานในพื้นหลัง การเปลี่ยนแปลงของไฟล์จะถูกส่งไปที่ stdout นอกจากนี้คุณสามารถเรียกใช้คำสั่งใด ๆ ในระหว่างเพียงแค่กดปุ่ม Enter


... แต่นั่นสร้างสองกระบวนการที่คุณต้องฆ่าและผสม STDOUT กับเอาท์พุตเบื้องหน้า
mpowered

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ที่จะทำลายห่วงกด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.