Grep का उपयोग करके फ़ाइल में अंतिम मिलान प्राप्त करना


58

Grep का उपयोग करके किसी फ़ाइल में एक नियमित अभिव्यक्ति का केवल अंतिम मिलान प्राप्त करने का सबसे अच्छा तरीका क्या है?

इसके अलावा, क्या यह शुरुआत के बजाय फ़ाइल के अंत से ग्रीपिंग शुरू करना संभव है और पहला मैच मिलने पर रुक जाता है?

जवाबों:


85

तुम कोशिश कर सकते हो

grep pattern file | tail -1

या

tac file | grep pattern | head -1

या

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
डेनिस विलियमसन

1
जोड़े गए अवरोध के साथ जो मैं grep -nवास्तविक फ़ाइल में लाइन नंबर ( ) प्राप्त करना चाहता था , मुझे लगता tacहै कि बहुत से बचा जाना था, जब तक कि मैं कुछ घटाव नहीं करना चाहता था wc -l। अन्यथा tacके साथ grep -m1भावना का एक बहुत बनाता है।
निक मेरिल

1
मैं इससे ज्यादा अच्छा संस्करण देखना पसंद करूंगा, क्योंकि मैं 20 जीबी की फाइल को खोजने का प्रयास कर रहा हूं।
जेफ

@DennisWilliamson का जवाब बहुत बेहतर है क्योंकि grepपहले मैच के बाद काम करना बंद हो जाएगा। बिना -m 1, grepपहले फ़ाइल में सभी मिलान पैटर्नhead मिलेंगे , फिर केवल पहला दिखाएगा - बहुत कम कुशल। डेनिस, कृपया इसे एक अलग उत्तर में पोस्ट करने पर विचार करें!
गिलाद मेयानी

1

Unix / Linux / Mac / Cygwin में विशाल पाठ फ़ाइलों के साथ काम करने वाले किसी व्यक्ति के लिए। यदि आप विंडोज में विंडोज के लिनक्स टूल्स के बारे में इसका उपयोग करते हैं: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows

अच्छा प्रदर्शन करने के लिए इस वर्कफ़्लो का अनुसरण कर सकते हैं:

  1. gzip के साथ सेक करें
  2. अपनी कुंजी के साथ फ़ाइल को इंडेक्स करने के लिए zindex (github पर: https://github.com/mattgodbolt/zindex ) का उपयोग करें
  3. zqपैकेज से अनुक्रमित फ़ाइल को क्वेरी करें ।

इसके गितुब रीडमे से उद्धरण:

एक सूचकांक बनाना

zindex को यह बताने की आवश्यकता है कि प्रत्येक पंक्ति का कौन सा भाग सूचकांक का गठन करता है। यह एक नियमित अभिव्यक्ति द्वारा किया जा सकता है, क्षेत्र द्वारा, या बाहरी कार्यक्रम के माध्यम से प्रत्येक पंक्ति को पाइप करके।

डिफ़ॉल्ट zindex द्वारा file.gz.zindex का इंडेक्स बनाया जाता है जब इंडेक्स file.gz से पूछा जाता है।

उदाहरण:

एक संख्यात्मक नियमित अभिव्यक्ति से मेल खाती लाइनों पर एक सूचकांक बनाएं। कैप्चर समूह उस हिस्से को इंगित करता है जिसे अनुक्रमित किया जाना है, और विकल्प दिखाते हैं कि प्रत्येक पंक्ति में एक अद्वितीय, संख्यात्मक सूचकांक है।

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

उदाहरण: CSV फ़ाइल के दूसरे क्षेत्र पर एक इंडेक्स बनाएं:

$ zindex file.gz --delimiter , --field 2 

उदाहरण:

डॉक्यूमेंट रूट के एक्शन ऐरे में किसी भी आइटम में JSON फ़ील्ड ऑर्डरआईड पर एक इंडेक्स बनाएं। Jq क्वेरी सभी orderId.ids की एक सरणी बनाती है, फिर उन्हें स्पेस के साथ जोड़ती है ताकि यह सुनिश्चित हो सके कि प्रत्येक व्यक्तिगत लाइन को jq में पाइप किया गया है जो आउटपुट की एक सिंगल लाइन बनाता है, जिसमें स्पेस द्वारा अलग किए गए कई मैच होते हैं (जो डिफ़ॉल्ट विभाजक है)।

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

सूचकांक को छोड़कर

Zq प्रोग्राम का उपयोग किसी इंडेक्स को क्वेरी करने के लिए किया जाता है। इसे संपीड़ित फ़ाइल और प्रश्नों की सूची का नाम दिया गया है। उदाहरण के लिए:

$ zq file.gz 1023 4443 554 

लाइन नंबर द्वारा आउटपुट करना भी संभव है, इसलिए किसी फ़ाइल से लाइनें 1 और 1000 प्रिंट करना:

$ zq file.gz --line 1 1000

1

मैं हमेशा बिल्ली का उपयोग कर रहा हूं (लेकिन यह थोड़ा लंबा रास्ता तय करता है): cat file | grep pattern | tail -1

मैं अपने linux admin course के शिक्षक को कॉलेज में दोष दूँगा जो बिल्लियों से प्यार करते हैं :))))

- इससे पहले कि आप इसे grepping से पहले एक फ़ाइल बिल्ली नहीं है। grep pattern file | tail -1और अधिक कुशल भी है।


6
यह काकेमॉक्स के जवाब का सिर्फ पहला हिस्सा है, बदतर को छोड़कर।
अगस्तुर

यह काम करता है, लेकिन यह अनावश्यक कदम उठाता है। हल्के उपयोग के लिए, यह समाधान ठीक काम करता है, लेकिन यह अच्छा प्रदर्शन नहीं करता है। कारण यह है कि आपको catफ़ाइल की आवश्यकता नहीं है और इसे करने के लिए पाइप करें grep। आप grepफ़ाइल को सीधे के माध्यम से खोज सकते हैं grep pattern file(और फिर tailअंतिम परिणाम वापस करने के लिए उपयोग करें), जैसा कि कैकेमॉक्स के उत्तर में है।
jvriesem
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.