एक साथ कई फ़ाइलों को पूंछते समय प्रत्येक पंक्ति की भीख माँगने पर फ़ाइल नाम दिखाएँ?


14

जब एक ही बार में कई फ़ाइलों को नीचे दिखाया गया है, तो क्या प्रत्येक पंक्ति के शुरू में फ़ाइल नाम दिखाने का कोई तरीका है?

tail -f one.log two.log

मौजूदा उत्पादन

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

जैसे कुछ खोज रहे हो

one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...

आप -vपूंछ के लिए (क्रिया) विकल्प को देख सकते हैं । यह आपके पूछ से बिल्कुल मेल नहीं खा सकता है, लेकिन यह एक शुरुआत है।
राहुल

मल्टीटैल ऐसा कर सकता है मुझे लगता है
गिलेस

जवाबों:


7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ धन्यवाद {} don_cristti


@don_crissti, धन्यवाद! (१) एक बनाम फ़ाइल - मेरे गिलास में अधिक शराब नहीं! (२) अच्छा विचार। मैं ऐसा कुछ करना शुरू करता हूं, लेकिन मैंने अपने आप से कहा "कोई भी रिक्त स्थान के साथ फ़ाइलों की पूंछ नहीं बनाएगा" :) - मैं आपके उत्कृष्ट सुझावों का उपयोग करूंगा।
जजॉओ

क्या आप लंबाई -8 की व्याख्या कर सकते हैं? यहाँ 8 क्यों है, मुझे केवल 8 काम पता हैं।
शिचेंग गुओ

1
tail -n 1 * .txt | awk '/ ^ ==> / {a = पदार्थ ($ 0, 5, लंबाई -8); अगला} {प्रिंट ए, $ 1} ’| awk '$ 2> 0 {if ($ 2! ~ / chrY /) प्रिंट $ 1}' | xargs -I {} qsub {}
गुओ

@ शिखेंगगू, 8 = लंबाई ("==>") + लंबाई ("<==")
जोजो

1
आश्चर्यजनक रूप से / आश्चर्यजनक रूप से आपका जूजू जादू awkसमाधान काम करता है!
ट्रेवर बोयड स्मिथ

6

संक्षिप्त जवाब

GNU पैरेलल में अच्छे विकल्पों का एक सेट है जो इस तरह की चीजों को करना वास्तव में आसान बनाता है:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

उत्पादन होगा:

one.log: one.log की सामग्री यहां ...
one.log: one.log की सामग्री यहां ...
दो.लॉग: दो.लॉग की सामग्री यहां ...
दो.लॉग: दो.लॉग की सामग्री यहां ...

अधिक स्पष्टीकरण

  • विकल्प --tagstring=strतार के साथ प्रत्येक उत्पादन लाइन टैग कर देता है str । से parallel आदमी पेज :
- स्ट्रैस्ट्रिंग स्ट्रै
                एक स्ट्रिंग के साथ टैग लाइनें। प्रत्येक आउटपुट लाइन के साथ तैयार किया जाएगा
                str और TAB (\ t)। str में रिप्लेसमेंट स्ट्रिंग्स जैसे {} हो सकते हैं।

                -tagstring को -u, --onall, andnonall का उपयोग करते समय अनदेखा किया जाता है।
  • सभी घटनाओं को {}समानांतर के तर्कों द्वारा प्रतिस्थापित किया जाएगा, जो इस मामले में, लॉग फ़ाइल नाम हैं; यानी one.logऔर two.log(सभी तर्कों के बाद :::)।

  • विकल्प --line-bufferकी आवश्यकता है क्योंकि कमांड का आउटपुट (जैसे tail -f one.logया tail -f two.log) मुद्रित किया जाएगा यदि वह कमांड समाप्त हो गया है। चूंकि tail -fफ़ाइल वृद्धि का इंतजार करना होगा, इसलिए आउटपुट को लाइन के आधार पर प्रिंट करना आवश्यक है जो --line-bufferऐसा करता है। फिर से parallel मैन पेज से :

-लाइन-बफर (अल्फा परीक्षण)
                लाइन के आधार पर बफर आउटपुट। -ग्रुप आउटपुट रखेगा
                एक साथ पूरी नौकरी के लिए। --ungroup आउटपुट को मिक्सअप करने देता है
                आधी लाइन एक नौकरी से आ रही है और आधी लाइन से आ रही है
                दूसरी नौकरी। -लाइन-बफर इन दोनों के बीच फिट बैठता है: जीएनयू समानांतर
                पूरी लाइन प्रिंट करेगा, लेकिन लाइनों को मिलाने की अनुमति देगा
                विभिन्न नौकरियों।

2

यदि tailयह अनिवार्य नहीं है, तो आप इसे grepप्राप्त करने के लिए उपयोग कर सकते हैं :

grep "" *.log

यह फ़ाइल नाम को प्रत्येक आउटपुट लाइन के उपसर्ग के रूप में प्रिंट करेगा।

आउटपुट *.logकेवल एक फ़ाइल तक फैलने पर टूट जाता है । इस सम्बन्ध में:

grep '' /dev/null *.log

मैं tail -fनहीं के उत्पादन में फ़ाइल का नाम दिखाने की जरूरत है grep
mtk

@serenesat यह सिर्फ फाइलों की संपूर्ण सामग्री को प्रिंट करेगा, यह नहीं होगा? ओपी फाइलनाम को छपवाने के लिए कह रहा था जब पूंछ निर्दिष्ट की गई है
राहुल

तुम भी सिर्फ --with-filenameया -Hहमेशा फ़ाइल नाम prepend मजबूर कर सकते हैं ।
ट्रेवर बॉयड स्मिथ

मैं वास्तव में इस जवाब से प्यार करता हूँ! वास्तव में वास्तव में 13 अक्षरों की तरह एक समाधान के साथ क्या आवश्यक है। के रूप में मुश्किल awkसमाधान के लिए या parallelजो स्थापित नहीं है।
ट्रेवर बॉयड स्मिथ

केवल समस्या यह है कि यदि आपकी लॉगफ़ाइल्स 1 मिलियन लंबी हैं। तब आपका grep कंसोल (या ssh पर) 1 मिलियन लाइनों को स्पैम करेगा ...
ट्रेवर बोयड स्मिथ

0

मेरा विचार कई फ़ाइलों से मर्ज किए गए लॉग के साथ एक एकल फ़ाइल बनाने का होगा, जैसे कि किसी ने यहां सुझाया और फ़ाइल नाम प्रस्तुत करना है:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG

0

साथ कुछ xargsऔर sedकाम कर सकता था:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.