Grep का उपयोग करके किसी फ़ाइल में एक नियमित अभिव्यक्ति का केवल अंतिम मिलान प्राप्त करने का सबसे अच्छा तरीका क्या है?
इसके अलावा, क्या यह शुरुआत के बजाय फ़ाइल के अंत से ग्रीपिंग शुरू करना संभव है और पहला मैच मिलने पर रुक जाता है?
Grep का उपयोग करके किसी फ़ाइल में एक नियमित अभिव्यक्ति का केवल अंतिम मिलान प्राप्त करने का सबसे अच्छा तरीका क्या है?
इसके अलावा, क्या यह शुरुआत के बजाय फ़ाइल के अंत से ग्रीपिंग शुरू करना संभव है और पहला मैच मिलने पर रुक जाता है?
जवाबों:
तुम कोशिश कर सकते हो
grep pattern file | tail -1
या
tac file | grep pattern | head -1
या
tac file | grep -m1 pattern
grep -n
वास्तविक फ़ाइल में लाइन नंबर ( ) प्राप्त करना चाहता था , मुझे लगता tac
है कि बहुत से बचा जाना था, जब तक कि मैं कुछ घटाव नहीं करना चाहता था wc -l
। अन्यथा tac
के साथ grep -m1
भावना का एक बहुत बनाता है।
grep
पहले मैच के बाद काम करना बंद हो जाएगा। बिना -m 1
, grep
पहले फ़ाइल में सभी मिलान पैटर्नhead
मिलेंगे , फिर केवल पहला दिखाएगा - बहुत कम कुशल। डेनिस, कृपया इसे एक अलग उत्तर में पोस्ट करने पर विचार करें!
Unix / Linux / Mac / Cygwin में विशाल पाठ फ़ाइलों के साथ काम करने वाले किसी व्यक्ति के लिए। यदि आप विंडोज में विंडोज के लिनक्स टूल्स के बारे में इसका उपयोग करते हैं: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows ।
अच्छा प्रदर्शन करने के लिए इस वर्कफ़्लो का अनुसरण कर सकते हैं:
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
मैं हमेशा बिल्ली का उपयोग कर रहा हूं (लेकिन यह थोड़ा लंबा रास्ता तय करता है): cat file | grep pattern | tail -1
मैं अपने linux admin course के शिक्षक को कॉलेज में दोष दूँगा जो बिल्लियों से प्यार करते हैं :))))
- इससे पहले कि आप इसे grepping से पहले एक फ़ाइल बिल्ली नहीं है। grep pattern file | tail -1
और अधिक कुशल भी है।
cat
फ़ाइल की आवश्यकता नहीं है और इसे करने के लिए पाइप करें grep
। आप grep
फ़ाइल को सीधे के माध्यम से खोज सकते हैं grep pattern file
(और फिर tail
अंतिम परिणाम वापस करने के लिए उपयोग करें), जैसा कि कैकेमॉक्स के उत्तर में है।
tac file | grep -m 1 pattern