कैसे पूंछ घटना पर बीप करने के लिए


14

मैं चाहता हूं कि मेरा पीसी हर टेल इवेंट पर एक सिस्टम बीप करे

मेरे पास निम्न कमांड है

tail -f development.log | grep "something rare"

वहाँ beeps करने के लिए यह पाइपिंग की तरह एक आसान तरीका है? पसंद

tail -f development.log | grep "something rare" | beep

यदि ऐसा है तो grep आउटपुट अभी भी दिखाया जाएगा?


वहाँ एक बीप कार्यक्रम है, जो डिबियन और वेरिएंट के लिए डिफ़ॉल्ट रेपो में है,
एप-गेट इनस्टॉल

जवाबों:


16

बस beepनिम्नलिखित के रूप में परिभाषित करें :

beep() { read a || exit; printf "$a\007\n"; beep; }

फिर, आप अपने आदेश का उपयोग कर सकते हैं:

tail -f development.log | grep "something rare" | beep

1
क्षमा करें, लेकिन यह काम नहीं कर रहा है, यह बीप या कुछ भी प्रिंट नहीं करता है
जैकब कोसोरोबा

4
यद्यपि टेल-ऑफ़ का प्रत्यक्ष उत्पादन तत्काल होता है, यह पाइप से होते ही बफ़र हो जाता है। आपको कुछ भी देखने से पहले पर्याप्त "कुछ दुर्लभ" के लिए इंतजार करना होगा।
15

आप कई बार sed(जैसे पूंछ और grep के बीच) आउटपुट को पास कर सकते हैं और something rareकई बार regexp को खुद से बदल सकते हैं। कितनी बार इसे करने की आवश्यकता होती है यह इस बात पर निर्भर करता है कि पाइप कितना बफर है।
डेविड स्पिललेट 19

6
@ डेविड - यह एक हिट-एंड-मिस दृष्टिकोण है। यदि आप किसी पाइप से गुजरने वाले डेटा को अनबफ़र करना चाहते हैं, तो इन उत्तरों में वर्णित किसी भी विधि का उपयोग करें: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe

2
@ नागुल के सुझाव से हटते हुए, यहाँ पर मेरे लिए काम करने वाला मंगलाचरण है:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
गिटारपिकर

10

GNU स्क्रीन में बिल्ट विंडो में बदलाव होने पर बिल्ट-इन फीचर होता है: मैन पेज के संबंधित सेक्शन को देखें ।

शीर्षक सारांश:

$ screen
$ tail -f yourfile.log    # inside the screen session
<C-a> M    # "Window 0 (bash) is now being monitored for all activity."

जैसा कि टिप्पणियों में बताया गया है, यह हर नए लॉग प्रविष्टि पर बीप करेगा , न कि केवल उन "कुछ दुर्लभ" से मेल खाता है, इसलिए यह वह नहीं करता है जो ओपी ने पूछा था। फिर भी IMHO जानने की एक उपयोगी ट्रिक।

आप दो screenविंडो खोलकर ( <C-a> cविंडो खोलने के <C-a> <C-a>लिए , दो खिड़कियों के बीच टॉगल करने के लिए) दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकते हैं :

  1. साथ नजर रखी tail -f yourfile.log | grep 'something rare'
  2. एक सादा के साथ, unmonitored tail -f yourfile.log

तब आप विंडो 2 में लॉग स्क्रॉल अतीत को देखने के लिए बैठ सकते हैं, और "कुछ दुर्लभ" होने पर आप विंडो 1 से बीप हो जाएंगे।

screen बहुत ही बहुमुखी है - मैं अत्यधिक इस पर पढ़ने की सलाह देता हूं।


1
यह केवल "कुछ दुर्लभ" पर नहीं होगा, यह होगा?

1
अगर यह सब उस विशेष खिड़की में हो रहा होता तो यह tail -f yourfile.log | grep something\ rareसिर्फtail -f logfile
डेविड स्पिल्ट के

उफ़, मैंने ध्यान नहीं दिया कि वह केवल एक बीप चाहता था something rare। इसे प्रतिबिंबित करने के लिए संपादित किया गया। Grep काम करेगा, लेकिन फिर वह लॉग के बाकी हिस्सों को नहीं देखेगा, केवल दुर्लभ लाइनें - जैसा कि मैं समझता हूं कि वह पूरे लॉग स्क्रॉलिंग अतीत को देखने में सक्षम होना चाहता है, लेकिन विशिष्ट घटनाओं पर सतर्क रहना चाहिए।
सैम स्टोक्स

1

आप आउटपुट को grep कमांड में बफर होने से रोक सकते हैं। विवरण के लिए आदमी grep देखें।

आप बीप में grep आउटपुट को पाइप कर सकते हैं।

निम्न उदाहरण मैन बीप से है ...

   As part of a log-watching pipeline

          tail -f /var/log/xferlog | grep --line-buffered passwd | \
          beep -f 1000 -r 5 -s

उन मैनुअल में बहुत अच्छी चीजें हैं। यदि केवल हम इसे खोजने के लिए उन्हें पढ़ने के लिए नहीं था। ;-)


1

वॉच कमांड में एक --beep विकल्प है, और आप मतदान अंतराल भी सेट कर सकते हैं, लेकिन 2 सेकंड के साथ मानक ठीक होना चाहिए

watch --beep 'tail development.log | grep "something rare"'

1
ध्यान दें, watchआपके पैरामीटर / कमांड को हर (अंतराल) खंडों पर चलाकर काम करता है और फिर पिछले रन के परिणाम आते हैं। इस प्रकार आप उपयोग करने के बजाय टेल कमांड के सामान्य संस्करण का उपयोग करना चाहेंगेtail -f
रयानविल्कॉक्स

यह मेरे लिए काम नहीं किया ( watch --beepमेरी पूंछ / grep जोड़ने और लपेटने के बावजूद , मुझे अभी भी बीप नहीं मिला)।
मशीनघाट

1

आप नियंत्रण-जी जोड़ने के लिए sed का उपयोग इस प्रकार कर सकते हैं:

tail -f myFile | sed "s/.*/&\x07/"

या बस दुर्लभ रेखाओं पर, बिना grep का उपयोग किए, इस प्रकार है:

tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"

जो कहते हैं: लाइनों जहां कुछ दुर्लभ होता है पर, एस नियंत्रण-जी के साथ एक ही सामान के लिए ubstitute सब कुछ अंत पर हमला बोला, और प्रिंट (लेकिन न खाने वाले लाइनों मुद्रित नहीं है)। बहुत अच्छा काम करता है!


0

हम्म, मुश्किल। हम शायद ऐसा कुछ कर सकते थे?

for i in `find | grep 7171`; do beep; echo $i; done

या आपके मामले में

for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done

ऐसा लगता है कि कुछ बफरिंग कर रहा है। अगर forलूप द्वारा इस बफरिंग को बंद करने का कोई तरीका है तो मैं देखूंगा ।

जाहिर है, आप का उपयोग करके पाइप की बफरिंग को समायोजित करने में सक्षम होना चाहिए, ulimit -pलेकिन मुझे अवैध तर्क के बारे में शिकायत रहती है। मुझे एक पोस्ट भी मिली है जो दावा करती है कि आपको इस सीमा को बदलने के लिए कर्नेल को फिर से खोलने की आवश्यकता है।


0

पिछली नौकरी में, मुझे केवल कमांड-फ़्यू के साथ एक विश्वसनीय द्रष्टा नहीं मिल सकता था, इसलिए मेरे पास नीचे की तरह एक आवरण स्क्रिप्ट थी, जिसने फ़ाइल को हर प्रदूषित सेकंड का निरीक्षण किया और इच्छुक वाक्यांश के लिए नई पंक्तियों को पकड़ लिया।

#!/bin/bash

file=$1
phrase=$2
poll_duration=$3

typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"

while [ 1 ]
do
        let new_linecount=`wc -l $file| awk '{print $1}'`
        if [[ $new_linecount > $checked_linecount ]]; then
                let "new_lines = $new_linecount-$checked_linecount"
                head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
                let checked_linecount=$new_linecount
        fi
        sleep $poll_duration
done

यह एक यूनिक्स मशीन पर था। लिनक्स पर, आप इसके इनवाइट फाइलवॉचर इंटरफ़ेस का उपयोग करके एक बेहतर जा सकते हैं । यदि यह पैकेज ( उबंटू पर इनोटिफाई-टूल्स ) मौजूद है, तो प्रतिस्थापित करें

sleep $poll_duration 

साथ में

inotifywait -e modify "$file"  1>/dev/null 2>&1

फ़ाइल को संशोधित करने तक यह कॉल ब्लॉक करता है। अवरुद्ध संस्करण लगभग उतना ही कुशल है जितना कि आपको उस tail -fसंस्करण के साथ क्या मिलेगा यदि पाइप को बफरिंग के बिना काम करने के लिए कॉन्फ़िगर किया जा सकता है।

नोट: स्क्रिप्ट पहले यह head --lines=$new_linecountसुनिश्चित करने के लिए कि हमने फाइल की गयी लाइनों को चेक किया है जब हमने इस लूप में चेक की गई फाइल का हिस्सा तिरछा नहीं किया है।

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