मेरे पास बहुत लंबी लॉग फाइलें हैं, क्या केवल 10 लाइनों को खोजने के लिए grep से पूछना संभव है?
मेरे पास बहुत लंबी लॉग फाइलें हैं, क्या केवल 10 लाइनों को खोजने के लिए grep से पूछना संभव है?
जवाबों:
पाइपों का जादू;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
विकल्प का उपयोग करते समय ऐसा करने का कोई तरीका है ? मैं उन सभी फाइलों को सूचीबद्ध करना चाहता हूं जो पहले 5 अक्षर हैं RIFFD
।
Google पर इसे खोजने वाले लोगों के लिए, मुझे n
कई फ़ाइलों की पहली पंक्तियों की खोज करने की आवश्यकता थी , लेकिन केवल मिलान फ़ाइलनामों को प्रिंट करने के लिए। मैंनें इस्तेमाल किया
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
FNR..nextfile
बंद हो जाता है 10 लाइनों एक बार एक फ़ाइल को संसाधित देखा गया है। //..{}
प्रिंट फ़ाइल नाम और पर चलता रहता है जब भी किसी दिए गए फ़ाइल शो में पहला मैच। अन्य कार्यक्रमों के लाभ के लिए फाइलनाम को उद्धृत करने के लिए, उपयोग करें
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1
ही सिर्फ 1st लाइन सर्च करेंगे। धन्यवाद!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
या awk
बिना किसी एकल प्रक्रिया के उपयोग के |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
प्रत्येक पंक्ति पर, यदि your_regexp
मेल खाता है, और रिकॉर्ड्स (लाइनें) 11 से कम है, तो यह डिफ़ॉल्ट क्रिया (जो इनपुट लाइन को प्रिंट कर रहा है) निष्पादित करता है।
या उपयोग करें sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
अपने regexp की जाँच करता है और लाइन को प्रिंट करता है ( -n
मतलब इनपुट को प्रिंट नहीं करता है, जो अन्यथा डिफ़ॉल्ट है), और 10 वीं पंक्ति के ठीक बाद छोड़ता है।
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- और तेज।
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
कर देता है।
awkish
। 2xifs
और 1xelse
ऐसे कमांड में जिसे एक्शन स्टेटमेंट की जरूरत नहीं है, aho बना देगा। वेनबर्गर और कर्निघन रो ...
आपके पास प्रोग्रामों के साथ-साथ कुछ विकल्पों का भी उपयोग होता है grep
। मेरी राय में सबसे सरल उपयोग है head
:
head -n10 filename | grep ...
head
पहले 10 लाइनों ( -n
विकल्प का उपयोग करके ) का उत्पादन करेगा , और फिर आप उस आउटपुट को पाइप कर सकते हैं grep
।
head
इस्तेमाल किया है -n 10
(मुझे सहित) है कि साकार नहीं head
द्वारा डिफ़ॉल्ट प्रदर्शित करता है केवल 10 लाइनों । :)
grep "pattern" <(head -n 10 filename)
आप निम्नलिखित लाइन का उपयोग कर सकते हैं:
head -n 10 /path/to/file | grep [...]
इसे पूरा करने के लिए आउटपुट को head -10 file
पाइप किया जा सकता है grep
:
head -10 file | grep …
पर्ल का उपयोग करना:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2
: पैटर्न से पहले दो लाइनें प्रिंट करें।
-B 2
: पैटर्न के बाद दो लाइनें प्रिंट करें।
head -10 log.txt # read the first 10 lines of the file.
-C 2
के रूप में भी ऐसा ही होगा-A 2 -B 2
grep -m6 "string" cov.txt
यह केवल पहले 6 लाइनों के लिए खोज करता है string
जोआचिम इस्कसन के जवाब के लिए एक विस्तार: अक्सर मुझे एक लंबी फ़ाइल के बीच से कुछ चाहिए, जैसे कि 5001 से 5020 तक की लाइनें, जिस स्थिति में आप के head
साथ संयोजन कर सकते हैं tail
:
head -5020 file.txt | tail -20 | grep x
यह पहले 5020 लाइनों को प्राप्त करता है, फिर उनमें से केवल अंतिम 20 को दिखाता है, फिर सब कुछ पाइप करता है।
(संपादित: मेरे उदाहरण संख्या में फेलपोस्ट त्रुटि, grep में जोड़ा गया पाइप)
grep -A 10 <पैटर्न>
यह पैटर्न और पैटर्न के बाद अगली 10 लाइनों को हथियाने के लिए है। यह केवल एक ज्ञात पैटर्न के लिए अच्छी तरह से काम करेगा, यदि आपके पास एक ज्ञात पैटर्न "सिर" सुझावों का उपयोग नहीं है।
head
:someCmd | head -10