एक विशाल लॉग फ़ाइल में ग्रीप (> 14 जीबी) केवल अंतिम एक्स जीबी?


34

मुझे एक विशाल लॉग-फाइल (14 जीबी से अधिक) में कुछ खोजने की जरूरत है। मुझे पूरा यकीन है कि यह पिछले 4 जीबी या तो में है।

क्या चीजों को गति देने के लिए पहले X GB को छोड़ने का कोई तरीका है?


7
LC_ALL=C grepइसे गति दे सकते हैं।
jfs

1
आप एक समझदार grepअभिव्यक्ति उठाकर बहुत अधिक गति प्राप्त कर सकते हैं ... अज्ञात लंबाई (जैसे a.*thing) के वाइल्डकार्ड कुछ मामलों में मूल्यांकन करने में अधिक समय लेते हैं। यह हो सकता है कि आप गलत चीज़ के लिए अनुकूलन कर रहे हैं (हालांकि यह फ़ाइल के केवल भाग को खोजने के लिए कभी दर्द नहीं करता है, जाहिर है - यह सिर्फ स्पीडअप का सबसे बड़ा स्रोत नहीं हो सकता है)।
फ्लोरिस

जवाबों:


75

मुझे लगता है कि आप केवल 4GB या पिछले स्विच का उपयोग करके केवल आउटपुट के लिए पूंछ का उपयोग कर सकते हैं-c

-c, --bytes = [+] NUM
आउटपुट अंतिम NUM बाइट्स; या प्रत्येक फ़ाइल के बाइट NUM के साथ शुरू करने के लिए -c + NUM का उपयोग करें

आप शायद के साथ कुछ कर सकते हैं dd भी निर्धारित करके bs=1और skipकरने के लिए ing ऑफसेट आप जैसे शुरू करना चाहते हैं

dd if=file bs=1024k skip=12g | grep something

83
बाद में, आपको लॉगोटेट को कॉन्फ़िगर करना चाहिए।
जेराल्ड श्नाइडर

3
@Rogier कृपया अपने प्रश्न में जोड़ने के बजाय समाधान के साथ उत्तर जोड़ें। यह स्व-उत्तर के समान है: serverfault.com/help/self-answer
AL

5
@istheEnglishway: खैर, नहीं, उन्होंने एक अलग कमांड पोस्ट की।
मोनिका

11
लेकिन आपका जवाब वास्तविक कमांड प्रदान नहीं करता है जो उस समाधान को लागू करता है, जो मूल्य जोड़ा जाता है। आप इसे अपने उत्तर में संपादित कर सकते हैं, या ओपी इसे एक नए उत्तर के रूप में पोस्ट कर सकता है। उन्हें निश्चित रूप से इस सवाल से नहीं जोड़ना चाहिए, जो हुआ है। और आप निश्चित रूप से "नाक में दम करना" जैसे एपिसोड के आसपास नहीं फेंकना चाहिए।
मोनिका

7
@istheEnglishway, मानें या न मानें उदाहरण के लिए चीजों को एक आदमी पृष्ठ को पढ़ने की तुलना में आसान बनाता है (यह भी देखें:
स्टैकओवरफ़्लो

32

मैं इसे सिर्फ इसलिए पोस्ट कर रहा हूं क्योंकि कुछ टिप्पणियों ने इसके लिए कहा।

मैं (15 जीबी फ़ाइल) का उपयोग करके क्या समाप्त कर रहा था। इसने बहुत तेजी से काम किया और मुझे एक टन बचा लिया।

tail -f -c 14G file | grep something

मैंने उसी फ़ाइल पर एक बहुत अल्पविकसित बेंचमार्क भी किया। मैंने परीक्षण किया:

grep xxx फ़ाइल
// ने हमेशा के लिए लिया (> 5 मिनट)

dd if = file bs = 1 स्किप = 14G | grep xxx
// बहुत तेज <1 सेकंड

टेल -c 14 जी | grep xxx
// बहुत तेज <2 सेकंड

tailबस थोड़ा कम है।

NB: प्रत्यय का इस्तेमाल किया gऔर Gप्रति आदेश अलग (Ubuntu 15.10)


क्या आपने बेंचमार्क के बीच डिस्क कैश को साफ़ किया है? मुझे पहली बार आई / ओ में ज्यादातर समय संदेह है। स्पीडअप 15 × के क्रम पर होना चाहिए, 300 × पर नहीं।
रीड करें

2
@ मुझे पता नहीं था लेकिन मैंने प्रत्येक कमांड को कई बार चलाया । मुझे पूरा यकीन है कि dd या टेल सिर्फ grep (कैश या नहीं) पर गति को काफी बढ़ावा देगा ।
रोजर

19

यह शीर्षक प्रश्न का उत्तर नहीं देता है, लेकिन यह वही करेगा जो आप करना चाहते हैं। फ़ाइल को उल्टा करने के लिए tac का उपयोग करें, फिर अपने स्ट्रिंग को खोजने के लिए grep का उपयोग करें। यदि आपकी स्ट्रिंग केवल एक बार या एक ज्ञात संख्या में फ़ाइल में होती है, तो इसे तब तक चलने दें, जब तक कि यह ज्ञात संख्या नहीं पा ले। इस तरह, यदि आपकी धारणा यह है कि यह फ़ाइल में कहां है तो गलत है, फिर भी यह मिल जाएगा। यदि आप इसे सीमित करना चाहते हैं, तो आप ऐसा करने के लिए सिर का उपयोग कर सकते हैं। हेड कमांड टैक और ग्रेप के बीच जाएगी।

तो कमांड ऐसा दिखता है:

tac < logfile | grep myString

1
मैं यहाँ उसी सटीक उत्तर को लिखने के लिए आया था। मुझे आश्चर्य है कि किसी ने तुम्हारा उत्थान नहीं किया।
दिमित्री ग्रिगोरीव

2
मुझे एक मिनट लगा, लेकिन फिर मैं सज़ा पर कराह उठा ... टैक बिल्ली के विपरीत है।
शामी

1
मैं एक आवेदन / डिबग लॉग में चारों ओर खुदाई करने की जरूरत है । क्योंकि यह लाइनों को उलट देता है, इसके पढ़ने में आसानी नहीं होती ;-) हालाँकि, बहुत तेज़ लगता है। कभी देखा नहीं tac, इसलिए धन्यवाद!
रोजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.