सूची के रूप में 'वॉच' कमांड का आउटपुट


27

मैं लॉग फ़ाइल में जोड़े गए प्रति मिनट लाइनों की संख्या का कुछ सरल गणना करना चाहता हूं।

मैं प्रत्येक सेकंड के लिए गिनती भी संग्रहीत करना चाहता हूं।

मुझे निम्न सूची के उत्पादन की आवश्यकता है जो एक सूची के रूप में है जिसे हर पल अपडेट किया जाएगा:

watch -n1 'wc -l my.log'

सूची के रूप में 'वॉच' कमांड के 'अपडेट' को कैसे आउटपुट करें?

जवाबों:


24

आप उस -tस्विच का उपयोग कर सकते हैं watchजिसके कारण यह शीर्ष लेख नहीं छाप सकता है। हालाँकि, यह अभी भी स्क्रीन को साफ करेगा ताकि आप एक साधारण शेल लूप के साथ बेहतर हो सकें:

while sleep 1; do
    wc -l my.log
done

एक फ़ायदा यह है, कि आप इसे सुधारने के dateमाध्यम sedसे आसानी से अन्य कमांड (जैसे ) और / या आउटपुट को जोड़ सकते हैं । वैसे, यदि आप लूप में स्वैप sleep 1करते हैं wc, तो यह स्वचालित रूप से त्रुटियों पर समाप्त हो जाएगा।


हालांकि ध्यान दें कि यह हर सेकंड ठीक नहीं होगा (zsh या ksh93 के साथ, आप सोते समय को समायोजित कर सकते हैं ताकि लूप में कमांड चलाकर बहाव को ध्यान में रखा जा सके, हालांकि)
स्टीफन चेज़लस

2
@StephaneChazelas न तो इसके साथ होगा wait- बस कोशिश करें watch -n 1 "sleep 5"
पीटर

वास्तव में (मैंने प्रॉप्स और बिजीबॉक्स कार्यान्वयन दोनों की जाँच की है)। मैंने सोचा था कि केवल एक ही चीज़ के watchलिए उपयोगी था, लेकिन यह आपको यह भी नहीं देता है कि आपका समाधान एक घड़ी आधारित के रूप में अच्छा है, लेकिन न तो "दर जिस पर एक लॉग फ़ाइल बढ़ती है" का जवाब बड़ी सटीकता के साथ देता है।
स्टीफन चेज़लस

ठीक है, अगर प्रति मिनट लाइनें अंतिम लक्ष्य हैं, तो हर 10 सेकंड में एक बार नमूना लेना पर्याप्त इम्हो से अधिक है - इसलिए ओवरहेड इतना भयानक नहीं है (जब तक कि फ़ाइल वास्तव में बड़ी नहीं होती, निश्चित रूप से)। और वास्तव में लूप के भीतर से, कोई भी समय की जानकारी (यदि आवश्यक हो तो कमांड समाप्त होने से पहले और बाद में भी) मुद्रित कर सकता है, और फिर सटीकता बड़ी फ़ाइलों के लिए भी बेहतर (परिमाण के आदेश) प्राप्त कर सकती है।
पीटर

1
@peterph के watchपास एक -pविकल्प है जो उस अधिकार को करेगा, यदि संभव हो तो (जाहिर है, आप ऐसा कमांड नहीं कर सकते हैं जो हर 1 सेकंड में 5 सेकंड लेता है, यदि आपको एक साथ कई अनुमति नहीं है)। मुझे पता है, मैंने इसे लिखा था :-P
derobert

8

एक पुराना सवाल, लेकिन मुझे सिर्फ एक बहुत आसान जवाब मिला:

watch -n1 'wc -l my.log | tee -a statistics.log'

यह आपके wcप्रत्येक सेकंड को निष्पादित करेगा , इसके आउटपुट को सांख्यिकी.लॉग फ़ाइल में जोड़ देगा, और इसे स्क्रीन पर भी दिखाएगा।
इसलिए, आप संख्याओं से भरी एक फ़ाइल के साथ अंत करेंगे, की क्रमिक संख्या का प्रतिनिधित्व करते हुए my.log


कृपया ध्यान दें कि यह कमांड है watch "($MYCMD | tee -a $MYLOG)", नहीं watch "($MYCMD)" | tee -a $MYLOG। अगर आपको यह गलत लगा, जैसे मैंने किया, तो आउटपुट बहुत भ्रमित करने वाला है। यहां ध्यान देने वाली एक और बात यह है कि यह कमांड डिफ़ॉल्ट रूप से प्रत्येक कमांड के निष्पादन की टाइमस्टैम्प को नहीं जोड़ता है, इसलिए लूप के साथ उत्तर अभी भी आपके लिए बेहतर काम कर सकता है।
ffledgling



1

जब मैं बेहतर / लॉग इन आउटपुट प्राप्त करने की कोशिश कर रहा था तो मुझे यह सवाल आया du -sh $data_path। मैंने यहां "कमांड, डू स्लीप" पैटर्न का इस्तेमाल किया, लेकिन कुछ जटिल AWK का इस्तेमाल किया, जो मुझे चाहिए था।

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

मैंने वास्तव में एक ऑनलाइनर के रूप में किया, यही कारण है कि अर्धविराम हैं। लेकिन इसे पठनीय बनाने के लिए, मैंने इसे तोड़ दिया। आउटपुट जैसा दिखता है:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

आप एक स्क्रिप्ट बना सकते हैं जो आपके लिए ऐसा करती है। मैंने उसे बुलाया keep(जैसे, उसे करते रहो) और उसे binरास्ते पर डाल दिया ।

यह मेरी स्क्रिप्ट है:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
आपको "$@"आदेश के बिना (तर्कों) को निष्पादित करने के लिए उपयोग करना चाहिए $*। इस तरह से आप शेल को उद्धृत तर्क आदि रखेंगे, क्योंकि उपयोगकर्ता उनसे उम्मीद करेंगे। FTFY।
रोज़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.