लिनक्स / एआईएक्स में टेल -0 एफ का उपयोग करके कई फाइलें कैसे पूंछें


39

मैंने विकल्प का उपयोग करके दो फ़ाइलों को जोड़ने का प्रयास किया:

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

लिनक्स में मुझे एक त्रुटि दिखाई देती है "पूंछ: एक समय में केवल एक फ़ाइल को संसाधित कर सकता है"।

AIX में मैं त्रुटि को "अमान्य विकल्प" के रूप में देखता हूं।

जब मैं उपयोग करता हूं तो यह ठीक काम करता है:

tail -f file1 -f file 2

लिनक्स में लेकिन AIX में नहीं।

मैं AIX / Linux में -0fया का उपयोग करके कई फ़ाइलों को पूंछने में सक्षम होना चाहता हूं-f

multitail इन ओएस में से किसी में मान्यता प्राप्त नहीं है।


क्या आपने screenदो अलग-अलग सत्र बनाने के लिए उपयोग करने की कोशिश की है ? आपको दोनों स्क्रीन पर पूंछ का उपयोग करने में सक्षम होना चाहिए? इसके अलावा, tmuxयदि आप इसे स्थापित कर चुके हैं तो भी काम कर सकते हैं।
रेकायो

जवाबों:


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जीएनयू पूंछ संस्करण द्वारा कई फाइलें विस्तारित की जाती हैं। AIX के साथ, आपके पास GNU टेल नहीं है, इसलिए आप ऐसा नहीं कर सकते। आप multitailइसके बजाय उपयोग कर सकते हैं ।

आप लिनक्स और AIX दोनों में मल्टीटैल स्थापित कर सकते हैं ।

  • AIX के साथ, आप यहां पैकेज डाउनलोड कर सकते हैं

  • लिनक्स में, multitailअक्सर रेपो में होता है, इसलिए आप डिस्ट्रो पैकेज मैनेजर का उपयोग करके इसे आसानी से स्थापित कर सकते हैं:

    • डेबियन / उबंटू में: apt-get install multitail
    • सेंटोस / फेडोरा में: yum install multitail

1
मल्टीटैल अच्छा काम करता है और वाक्य रचना सरल है:multitail -i path/to/file1 -i path/to/file2
हाउसमेड

6

निम्न चीज़ स्टड आउट पर आउटपुट चीजों के लिए ठीक काम करती है

tail -f file1 & tail -f file2

मैं pipeएक और प्रक्रिया के लिए उत्पादन करना चाहता था । उपरोक्त मामले &में यह पृष्ठभूमि में चलने से पहले हिस्सा बना रहा था और केवल दूसरे भाग pipedको संसाधित करने के लिए किया जा रहा था

इसलिए मैंने इस्तेमाल किया

tail -f file1 file2 | process

@ स्टीफन आपका जवाब एकदम सही है, लेकिन सिर्फ मेरे इस्तेमाल के मामले का जिक्र कर रहा हूं जिसमें थोड़ा ट्विस्ट है।


मुद्दा यह है कि tail -f file1 file2एआईएक्स पर काम नहीं करता है जहां पूंछ केवल एक फ़ाइल नाम को स्वीकार करती है। आप पाइप पर (tail -f file1 & tail -f file2) | processदोनों के स्टडआउट को पुनर्निर्देशित कर सकते हैं । tailprocess
स्टीफन चेजलस

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 17

@EbNash ने मेरे उत्तर के लिए क्या काम किया?
रेकायो '

0

SunOS 5.10 पर मेरे लिए निम्नलिखित कार्य।

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

दोनों पूंछ पृष्ठभूमि में चलेंगे। फ़ाइलों में परिवर्तन stdout में फेंक दिया जाएगा। इसके अलावा, आप बस बीच में प्रवेश करके किसी भी कमांड को चला सकते हैं।


... लेकिन यह दो प्रक्रियाओं को बनाता है जिन्हें आपको अग्रभूमि के साथ STDOUT को मारना और मिक्स करना होता है।
mpowered

0

निम्नलिखित ऑन्लाइनर का उपयोग करें:

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

हर 1 सेकंड में, स्क्रिप्ट फ़िल्टर किए गए स्ट्रीम की 10 अंतिम पंक्तियों को प्रिंट करेगी।

लूप को तोड़ने के लिए, दबाएं CtrlC

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.