पूंछ -f, लेकिन पंक्ति संख्याओं के साथ


21

मैं यह देखने की कोशिश कर रहा हूं कि एक दूरस्थ सर्वर पर कितनी बार मनमानी राशि के भीतर foo barदिखाई देता है /var/log/foo.log, लेकिन मैंने अब तक जो कुछ भी आजमाया है वह काम नहीं किया है।

मुझे पहले से ही एक टाइमर स्क्रिप्ट मिल गई है जिसका उपयोग मैं यह जानने के लिए करता हूं कि जब से मैंने पूंछना शुरू किया है, तब से कब तक है /var/log/foo.log, और अब मैं यह बताना चाहूंगा foo barकि टेल्ड आउटपुट में कितनी बार दिखाई दिया है।

मैंने Google खोजा, लेकिन मुझे परिणामों के पहले 10 पृष्ठों में कुछ भी उचित नहीं मिला।

यहां मैंने निराशाजनक परिणामों के साथ प्रयास किया है:

## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='

## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -

##  works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'

मैंने एक ऐसी स्क्रिप्ट भी लिखने की कोशिश की थी जो पसंद आएगी tail -f, लेकिन मैंने उसके साथ सीमित-से-कोई हेडवे नहीं बनाया।

ध्यान दें

दूरस्थ सर्वर coreutils के एक पुराने संस्करण चल रहा है, और उन्नयन के लिए एक विकल्प है, लेकिन है नहीं किसी भी तरह से वांछित समाधान।


2
किस तरह से यह काम नहीं करता है? --line-bufferedकरने के लिए विकल्प का प्रयास करें grep। याtail -f ... | awk '/foo bar/{print ++n, $0}'
स्टीफन चेज़ालस

यह रिमोट पर काम क्यों नहीं करता है? उदाहरण:tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'

जवाबों:


29
tail -f | nl

मेरे लिए काम करता है और मैंने जो सोचा था, वह पहला है - यदि आप वास्तव में 1 से पंक्तियों की संख्या चाहते हैं और देखी गई फ़ाइल से वास्तविक पंक्ति संख्या के साथ नहीं। grepयदि आवश्यक हो तो वैकल्पिक रूप से जोड़ दें (या तो पहले या बाद में nl)। हालाँकि, याद रखें कि बफरिंग हो सकती है। मेरी विशेष मामले में, grepहै --line-bufferedविकल्प है, लेकिन nlयह उत्पादन बफ़र्स और कहा कि बंद स्विच करने का विकल्प नहीं है। इसलिए tail | nl | grepकॉम्बो वास्तव में अच्छी तरह से प्रवाह नहीं करता है।

ने कहा कि,

tail -f | grep -n pattern

मेरे लिए भी काम करता है। पूरे लॉग फ़ाइल की शुरुआत के बजाय "टेलिंग" की शुरुआत से नंबर फिर से शुरू होता है।


सर्वर पर चल रहे grep के संस्करण का कोई -nविकल्प नहीं है ।
अलेक्सज मगुरा

यह, हालांकि, लंबे विकल्प है --line-number: tail -f /var/log/foo.log | grep foo\ bar --line-numberकाम करता है!
अलेक्सेज मगुरा

1
यह दिलचस्प है - मैंने POSIX को इस तरह से चेक नहीं किया है, लेकिन GNU grep मैनपेज कहता है: -n POSIX द्वारा निर्दिष्ट है
पेट्रफ

16

मुझे लगता है कि यह बेहतर है।

less -N +F <filepath>

2
क्या आप बता सकते हैं कि आप इसके बेहतर क्यों मानते हैं?
नवजातत्रोन

यह एक बड़ा संपादन है, मैं पलट रहा हूं।
एडम एबर्लिन

3
संपूर्ण फ़ाइल को संदर्भ के रूप में लेने वाली लाइन संख्या को दर्शाता है। पूंछ -f | nl टेल के पहले आउटपुट को संदर्भ के रूप में लेते हुए लाइन नंबर दिखाता है।
राफेलवेल

यह बहुत आसान है और ओपी के शीर्षक को संबोधित करता है, लेकिन उनका सवाल नहीं है । वे जानना चाहते थे कि एक फाइल में X कितनी बार दिखाई देता है: P
टिममह

6

आप आउटपुट को भी पाइप कर सकते हैं less, इसमें एक लाइन नंबर सुविधा है, -Nजो आपको लॉग के माध्यम से आगे और पीछे स्क्रॉल करने की अनुमति देगा।

$ tail -f /var/log/foo.log | less -N

उदाहरण

  1 Jan 17 22:11:58 greeneggs fprintd[4323]: ** Message: entering main loop
  2 Jan 17 22:12:01 greeneggs su: (to root) saml on pts/5
  3 Jan 17 22:12:28 greeneggs fprintd[4323]: ** Message: No devices in use, exit
  4 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Git | personal_repo | Checking for remote changes...
  5 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git rev-parse HEAD
  6 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git ls-remote --heads --exit-code "ssh://sam@sparkleshare.jake      
  6 8us.org/home/sam/SparkleShare/personal_repo.git" master
  7 Jan 17 22:12:58 greeneggs gnome-session[1876]: X11 forwarding request failed on channel 1
  8 Jan 17 22:12:58 greeneggs gnome-session[1876]: 22:12:58 | Git | personal_repo | No remote changes, local+remote: 532213be48cce3b93cb177d409faa      
  8 03b71d0cfa5
  9 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Pinging tcp://notifications.sparkleshare.org:443/
 10 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Received pong from tcp://notifications.sparkleshare.org:443/

नोट: आउटपुट का नोटिस लें। आप इस सुविधा को पसंद कर सकते हैं या नहीं कर सकते हैं, लेकिन यह लंबी लाइनें लेगा और उन्हें काट देगा ताकि वे अगली पंक्ति पर जारी रहें, लेकिन फिर भी उसी अनुरूप संख्या को बनाए रखें। मुझे यह सुविधा अमूल्य लगती है जब लॉग फ़ाइलों को पार्स करते हैं जो विस्तृत हैं! आप इस सुविधा का प्रभाव 6 और 8 लाइनों पर देख सकते हैं ।


यह अस्पष्ट है। फ़ाइल नाम कहाँ निर्दिष्ट किया गया है? यह स्पष्ट किया जाना चाहिए, यह देखते हुए कि आउटपुट को फ़ाइल नाम की अंतिम 10 पंक्तियों से शुरू किया गया है, क्योंकि यह डिफ़ॉल्ट व्यवहार है tail। लंबी लाइनों के रूप में, उस व्यवहार का lessउपयोग करने के भीतर toggled है -S
ILMostro_7

2

Grep करने के लिए नया ही लॉग फ़ाइल में लाइनों के रूप में वे अपने लाइन संख्या के साथ आते हैं, आप कर सकता है:

{
  initial_lines=$(wc -l)
  tail -n +1 -f | awk -v NR="$initial_lines" '/pattern/{print NR": "$0}'
} < file.log

(इसके साथ mawk, आप -Winteractiveइसके इनपुट (!) बफरिंग को रोकने के लिए विकल्प जोड़ना चाहेंगे ।

wc -lउन पंक्तियों को पढ़ता है जो पहले से ही वहां थीं और उन्हें गिनती हैं (newline वर्ण जो इसका अर्थ है कि यह अभी भी काम करता है भले ही अंतिम पंक्ति अभी तक पूर्ण नहीं है), और फिर हम tail -fबाकी (जहां से wcपढ़ना बंद कर दिया है) और बताएं awkकि लाइन की संख्या क्या है पहले वाला इसे देखता है।


lचर नाम के रूप में चुनने ने मुझे $ l पर अपनी आँखें बना दीं, यह सोचकर $1^ ^ (लेकिन जैसा कि मुझे पता है (और 100% विश्वास) आप, मैंने फिर से देखा और सच देखा)। बस जिज्ञासा के लिए: wc -lऔर tail -f(अगर फ़ाइल तेज़ी से बढ़ती है, तो कुछ लाइनों को छोड़ना पड़ सकता है और इस तरह NR गलत संख्या से शुरू होता है) के बीच कुछ "रेस कंडीशन" से बचना संभव है$l बजाय लाइनों ? (और पूंछ की क्या सीमा है -n? शायद एक अस्थायी मध्यवर्ती फ़ाइल के साथ?
ओलिवियर दुलैक

@OlivierDulac, tail -n +1(प्रारंभ स्थिति से कुछ भी पढ़ें) दौड़ की स्थिति की चिंताओं को संबोधित करता है। यह उन पंक्तियों को पढ़ेगा जो उस समय wc -lसमाप्त हुई फ़ाइल में नहीं थीं , सटीक स्थिति से wcइसे छोड़ दिया था। तो NR की सही स्थिति होगी, चाहे कितनी भी लाइनें wcसमाप्त और tailशुरू होने के बीच लिखी गई हों । यदि आपने बताया tailहै कि फ़ाइल के अंत के सापेक्ष कुछ स्थिति से शुरू करना है जो आपके पास समस्याएँ हैं।
स्टीफन चेजेलस

ओह, इंटररस्टिंग: वास्तव में, डेटा स्टड में जमा हो जाता है जबकि कुछ भी नहीं पढ़ता है (सिर के शुरू होने तक डब्ल्यूसी के अंत के बीच) ... मुझे यह महसूस करना चाहिए था। धन्यवाद। अब मैं देखता हूं कि आप "<फ़ाइल" क्यों हैं। चतुर, हमेशा की तरह :)
ओलिवियर दुलाक

1
@OlivierDulac, सीमाओं के बारे में (जो tail -n +1यहां लागू नहीं होती हैं), नियमित फ़ाइलों के लिए, अधिकांश कार्यान्वयन में एक ऐसा नहीं होता है जैसा कि वे अंत और seekपीठ से शुरू कर सकते हैं जब तक कि वे nth newline को एक से अधिक buf स्टोर करने की आवश्यकता के बिना नहीं पाते हैं स्मृति में डेटा का। गैर-खोज योग्य इनपुट के लिए, यह वह जगह है जहाँ आप सीमा में भाग सकते हैं। POSIX को कम से कम 10 x LINE_MAX बाइट्स (LINE_MAX कम से कम 2048) स्टोर करने में सक्षम होने के लिए कार्यान्वयन की आवश्यकता होती है। GNU टेल की मेमोरी AFAIK के अलावा अन्य कोई सीमा नहीं है
स्टीफन चेज़लस

0

यदि आप शुरुआत से नंबर देना चाहते हैं तो आपको सभी लाइनों पर लागू करने के लिए grep -n की आवश्यकता होगी।

 tail -f -n100000000 filename.log | grep -n '' 

यदि आप केवल अंतिम 10 दिखाना चाहते थे, तो मुझे लगा कि आप फ़ाइल को री-टेल कर सकते हैं:

 tail -f -n100000000 filename.log | grep -n '' | tail -n10

पहला काम है, लेकिन बहुत अधिक उत्पादन दिखाता है। मुझे नहीं पता कि दूसरा काम क्यों नहीं करता है।


टेल में एक "सभी लाइनों को दिखाने" की ज़रूरत नहीं है, इसलिए मेरे 100000000
मार्टिन क्लीवर

1
tail -n +1 -fशुरू से पूंछना।
स्टीफन चेज़लस

1
दूसरा काम नहीं करता है क्योंकि सही-सबसे tailकुछ भी आउटपुट नहीं कर सकता है जब तक कि उसने अपने इनपुट की अंतिम पंक्ति को नहीं देखा है (यह कैसे पता चलेगा कि 10 वीं अंतिम पंक्ति क्या है?) जो कभी tail -fभी बंद नहीं होगी ।
स्टीफन चेजेलस

-1

cat -n [filename] | tailयदि आपको जिस चीज़ की तलाश है, वह कमांड को हाल ही के रिकॉर्डों की त्वरित गिनती और प्रदर्शन मिलेगा।

यह -fस्विच बच निकलने तक लगातार बना रहता है - जो वास्तव में आपके परिदृश्य में लागू नहीं होता है या अनावश्यक है।

wc -l [filename] लक्ष्य में लाइनों की एक गिनती मिल जाएगा

wc -l [filenameprefix]* पैटर्न से मेल खाती सभी फाइलों में सभी पंक्तियों की गणना करेगा और यहां तक ​​कि अंत में एक सारांश कुल रिपोर्ट करेगा।

अधिक पूर्ण विवरण अधिक पूर्ण प्रतिक्रियाएँ दे सकता है।


-1

यह तर्क है nया --lines(थोड़े अलग तरीके से देखें, नीचे देखें):

$ tail -f -n 25 /path/to/file.txt

$ tail -f --lines=25 /path/to/file.txt

सहायता भी देखें:

$ tail --help

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