Logfiles में मानव पठनीय तिथि के लिए युगांतर मिलीसेकंड से समय बदलें / बदलें

Dec 05 2020

मेरे पास निम्न संरचना के साथ एक लॉग फ़ाइल है

उदाहरण:

1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...

अब मैं युगीन मिलीसेकंड से समय को DD.MM.YYYY HH: MM: SS में बदलना चाहता हूं। सभी लॉग फ़ाइलों में एक डेबियन सिस्टम पर बैश कमांड के साथ।

मैंने यहां और अन्य वेबसाइटों पर प्रदान किए गए विभिन्न समाधानों की कोशिश की लेकिन यह वास्तव में मेरे लिए काम नहीं किया।

क्या कोई भी कृपया मेरी मदद कर सकता है?

चियर्स

उपवास

जवाब

4 thanasisp Dec 05 2020 at 22:13

यदि आप एक शेल स्क्रिप्ट रीडिंग लाइन को लाइन या एक awkस्क्रिप्ट कॉलिंग सिस्टम का उपयोग करते हैं date, तो यह बहुत धीमी गति से, बहुत सारी प्रक्रियाएं होंगी। आपको एक साधारण awk, पर्ल, पायथन, या कुछ भी, स्क्रिप्ट का उपयोग करना होगा। सभी भाषाओं में प्रारूप के बीच रूपांतरण के लिए मानक डेटाटाइम कार्य हैं।

यहाँ और यहाँ कुछ अच्छे संदर्भ हैं। यदि आप GNU awk टाइम फ़ंक्शंस का उपयोग करना चाहते हैं और strftime(), आपको अपने मामले की आवश्यकता है, तो आप मिलकॉम्प को छोड़कर युग के विकल्प का चयन कर सकते हैं:

$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

या मिलिसेकंड को एक साथ प्रिंट करने के लिए:

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

या दिन-महीने-वर्ष प्रारूप को मुद्रित करने के लिए:

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext
2 terdon Dec 05 2020 at 22:14

यह कुछ ऐसा नहीं है जो आप एक bash कमांड के साथ कर सकते हैं, आपको एक बाहरी प्रोग्राम की आवश्यकता है क्योंकि bash फ्लोटिंग पॉइंट गणित नहीं कर सकता है और तारीखों को नहीं संभाल सकता है। मुझे संदेह है कि आप सिर्फ "कमांड लाइन पर" हालांकि, और आपको वास्तव में शुद्ध बैश समाधान की आवश्यकता नहीं है। इस धारणा के साथ, यहाँ gawk(GNU awk) समाधान है:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

strftimeसमारोह एक तारीख को टाइमस्टैम्प बदल देता है। चूँकि आपका मिलीसेकंड में है, इसलिए हम sprintfइसे सेकंड में बदलने के लिए उपयोग करते हैं। फ़ाइनल 1;बताता gawkहै कि हमने नई वैल्यू $1(पहले फ़ील्ड) को असाइन करने के बाद लाइन को प्रिंट करना है ।


याद रखें कि आउटपुट आपके टाइमज़ोन पर निर्भर करेगा। उदाहरण के लिए, ऊपर जीएमटी टाइमज़ोन पर सेट की गई मशीन पर चलाया गया था। यही कारण है कि मेरी संख्या @ थानस्पिस् के उत्तर में अलग-अलग हैं जो संभवतः एक अलग समयक्षेत्र पर चलाए गए थे। आप इसे नियंत्रित कर सकते हैं और TZकमांड चलाते समय चर को सेट करके आउटपुट को बदल सकते हैं । उदाहरण के लिए, इसकी तुलना करें:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

इसके लिए:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

या यह:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext