मेरे पास निम्नलिखित प्रारूप में फ़ाइल है और मैं अंतिम n मिनटों के लिए फ़ाइल को पढ़ना चाहता हूं।

2019-09-22T04:00:03.052+0000: 774093.613: [GC (Allocation Failure)
Desired survivor size 47710208 bytes, new threshold 15 (max 15)
[PSYoungGen: 629228K->22591K(650752K)] 1676693K->1075010K(2049024K), 0.0139764 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]

मैं उपयोगकर्ता की आवश्यकता के आधार पर x n मिनट के लिए लॉग फ़ाइल पढ़ना चाहता हूं ताकि मैं उपयोगकर्ता की आवश्यकता के आधार पर पिछले 30 मिनट या 120 मिनट तक इसकी निगरानी कर सकूं।

मैंने फ़ाइल को पढ़ने के लिए नीचे दिए गए विकल्प की कोशिश की है, लेकिन लगता है कि यह अपेक्षा के अनुरूप काम नहीं कर रहा है:

awk -F - -vDT="$(date --date="60 minutes ago" +"%Y-%m-%dT%H:%M:%S")" ' DT > $NF,$0' gc-2019-09-13-04-58.log.0.current

इसके अलावा, उपरोक्त आदेश में "60 मिनट पहले" विकल्प है जिसे मैंने एक चर के रूप में पारित करने का प्रयास किया v1=30 , date --date="$v1 minutes ago", यह भी काम नहीं कर रहा है?

कृपया सुझाव दें कि इस फाइल को अंतिम x मिनट तक कैसे पढ़ा जाए?

1
dhandma 22 सितंबर 2019, 10:24
2
और वैसे, आपके संक्षिप्त प्रश्न इतिहास को देखते हुए मुझे लगता है कि आपको यह meta.stackexchange.com/a/5235 पढ़ना चाहिए। और अगर टीएल; डीआर कम से कम तस्वीरों पर एक नज़र डालें।
 – 
James Brown
22 सितंबर 2019, 13:48

2 जवाब

यहाँ GNU awk (समय के कार्यों के लिए एक है और gensub())। पहले परीक्षण डेटा, वर्ष के साथ आपके डेटा की दो पंक्तियाँ पहले वाले में बदल गईं:

2018-09-22T04:00:03.052+0000: 774093.613: [GC (Allocation Failure)
Desired survivor size 47710208 bytes, new threshold 15 (max 15)
[PSYoungGen: 629228K->22591K(650752K)] 1676693K->1075010K(2049024K), 0.0139764 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
2019-09-22T04:00:03.052+0000: 774093.613: [GC (Allocation Failure)
Desired survivor size 47710208 bytes, new threshold 15 (max 15)
[PSYoungGen: 629228K->22591K(650752K)] 1676693K->1075010K(2049024K), 0.0139764 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]

और awk प्रोग्राम, जिसमें tac का उपयोग करके डेटा को पीछे की ओर फीड किया जाता है:

$ tac file | gawk '
BEGIN {
    threshold = systime()-10*60*60 # time threshold is set to 10 hrs
    # threshold = systime()-mins*60# uncomment and replace with above 
}                                  # for command line switch
{
    if(match($1,/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/)) {
        if( mktime( gensub(/[-T:]/," ","g",substr($1,RSTART,RLENGTH))) < threshold)
            exit                   # exit once first beyond threshold time is found
        print $0 b                 # output current record and the buffer
        b=""                       # reset buffer
    } else                         # for non-time starting records:
        b=ORS $0 b                 # buffer them
}'

आप एक फ़ाइल में 's के बीच प्रोग्राम कोड लिख सकते हैं, program.awk कह सकते हैं और इसे tac file | gawk -f program.awk के साथ चला सकते हैं और इसके अलावा BEGIN अनुभाग और इसके साथ चल रहा है:

$ gawk -v mins=10 -f program.awk <(tac file)
2
James Brown 22 सितंबर 2019, 13:43
2
बहुत बहुत धन्यवाद जेम्स..यह मेरे लिए ठीक काम करता है और मैं विशाल लॉग फ़ाइल को पार्स करने में सक्षम हूं और इसका उपयोग करके मॉनिटर लिखने में सक्षम हूं..यह शानदार कोड है। एक बार फिर धन्यवाद..
 – 
dhandma
23 सितंबर 2019, 04:06
ज़रूर। बस उस लिंक पर एक नज़र डालना न भूलें जिसे मैंने आपके प्रश्न की टिप्पणियों में पोस्ट किया था।
 – 
James Brown
23 सितंबर 2019, 07:50

लॉग फ़ाइल की अंतिम N पंक्तियाँ प्राप्त करें। सबसे महत्वपूर्ण आदेश "पूंछ" है। ... किसी फ़ाइल से लगातार नई लाइनें प्राप्त करें। शेल पर रीयलटाइम में लॉग फ़ाइल से सभी नई जोड़ी गई लाइनें प्राप्त करने के लिए, कमांड का उपयोग करें: tail -f /var/log/mail.log। ... परिणाम पंक्ति दर पंक्ति प्राप्त करें। ... लॉग फ़ाइल में खोजें। ... किसी फ़ाइल की संपूर्ण सामग्री देखें।

0
Oluwatunmise 22 सितंबर 2019, 10:44