क्या मैं किसी फ़ाइल की केवल पहली n पंक्तियाँ प्राप्त कर सकता हूँ?


126

मेरे पास बहुत लंबी लॉग फाइलें हैं, क्या केवल 10 लाइनों को खोजने के लिए grep से पूछना संभव है?

जवाबों:


175

पाइपों का जादू;

head -10 log.txt | grep <whatever>

13
आप एक मनमाना धारा भी लगा सकते हैं head:someCmd | head -10
स्टुअर्ट नेल्सन

1
मानक उत्पादन के लिए पहली 10 लाइनों को प्रिंट करने के लिए हेड डिफॉल्ट होता है, इसलिए यह 10 लाइनों के लिए वैध हैhead log.txt | grep <whatever>
Zlemini

5
क्या grep के -lविकल्प का उपयोग करते समय ऐसा करने का कोई तरीका है ? मैं उन सभी फाइलों को सूचीबद्ध करना चाहता हूं जो पहले 5 अक्षर हैं RIFFD
जेम्स एम।

49

Google पर इसे खोजने वाले लोगों के लिए, मुझे nकई फ़ाइलों की पहली पंक्तियों की खोज करने की आवश्यकता थी , लेकिन केवल मिलान फ़ाइलनामों को प्रिंट करने के लिए। मैंनें इस्तेमाल किया

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfileबंद हो जाता है 10 लाइनों एक बार एक फ़ाइल को संसाधित देखा गया है। //..{}प्रिंट फ़ाइल नाम और पर चलता रहता है जब भी किसी दिए गए फ़ाइल शो में पहला मैच। अन्य कार्यक्रमों के लाभ के लिए फाइलनाम को उद्धृत करने के लिए, उपयोग करें

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
मैं उन लोगों में से एक था जिन्होंने इसे Google पर पाया। धन्यवाद!
फ्लोरिस

मेरे लिए, इस कोड ने फ़ाइल का पूरा पथ प्रिंट कर लिया है। जो वास्तव में मुझे चाहिए था। साथ FNR=1ही सिर्फ 1st लाइन सर्च करेंगे। धन्यवाद!
ब्रायन डब्ल्यू

2
एक निर्देशिका पर पुनरावर्ती करने के लिए:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
ऑरेंजडॉग

1
साभार @OrangeDog एक मामूली सुधार: होना चाहिए-type f
डेविड Siegal

26

या awkबिना किसी एकल प्रक्रिया के उपयोग के |:

awk '/your_regexp/ && NR < 11' INPUTFILE

प्रत्येक पंक्ति पर, यदि your_regexpमेल खाता है, और रिकॉर्ड्स (लाइनें) 11 से कम है, तो यह डिफ़ॉल्ट क्रिया (जो इनपुट लाइन को प्रिंट कर रहा है) निष्पादित करता है।

या उपयोग करें sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

अपने regexp की जाँच करता है और लाइन को प्रिंट करता है ( -nमतलब इनपुट को प्रिंट नहीं करता है, जो अन्यथा डिफ़ॉल्ट है), और 10 वीं पंक्ति के ठीक बाद छोड़ता है।


1
10 वीं पर क्यों नहीं छोड़ा? (सेड सॉल्यूशन देखें)
पोटोंग

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- और तेज।

1
@ आप सही, सही हैं। @srikanthradix तेजी से हो सकता है जबकि आप समाधान regexps के लिए खोज नहीं है, लेकिन केवल तय तार के लिए। awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileकर देता है।
Zsolt Botykai

4
प्लस शैली नहीं है awkish2xifsऔर 1xelseऐसे कमांड में जिसे एक्शन स्टेटमेंट की जरूरत नहीं है, aho बना देगा। वेनबर्गर और कर्निघन रो ...
जयपाल सिंह

1
मुझे लगता है, NR के बजाय FNR का उपयोग करना बेहतर होगा, क्योंकि यदि आप कई फ़ाइलों के साथ awk का उपयोग करते हैं तो FNR प्रत्येक फ़ाइल के लिए 0 से शुरू होता है।
व्लादिस्लाव सवैंको

9

आपके पास प्रोग्रामों के साथ-साथ कुछ विकल्पों का भी उपयोग होता है grep। मेरी राय में सबसे सरल उपयोग है head:

head -n10 filename | grep ...

headपहले 10 लाइनों ( -nविकल्प का उपयोग करके ) का उत्पादन करेगा , और फिर आप उस आउटपुट को पाइप कर सकते हैं grep


6
मैं भी एहसास नहीं था, सब समाधान यहाँ का उपयोग कर headइस्तेमाल किया है -n 10 (मुझे सहित) है कि साकार नहीं headद्वारा डिफ़ॉल्ट प्रदर्शित करता है केवल 10 लाइनों । :)
जयपाल सिंह



3

इसे पूरा करने के लिए आउटपुट को head -10 fileपाइप किया जा सकता है grep:

head -10 file | grep 

पर्ल का उपयोग करना:

perl -ne 'last if $. > 10; print if /pattern/' file

3
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.

1
अगर मुझे याद है, -C 2के रूप में भी ऐसा ही होगा-A 2 -B 2
डेविड LeBauer


2

जोआचिम इस्कसन के जवाब के लिए एक विस्तार: अक्सर मुझे एक लंबी फ़ाइल के बीच से कुछ चाहिए, जैसे कि 5001 से 5020 तक की लाइनें, जिस स्थिति में आप के headसाथ संयोजन कर सकते हैं tail:

head -5020 file.txt | tail -20 | grep x

यह पहले 5020 लाइनों को प्राप्त करता है, फिर उनमें से केवल अंतिम 20 को दिखाता है, फिर सब कुछ पाइप करता है।

(संपादित: मेरे उदाहरण संख्या में फेलपोस्ट त्रुटि, grep में जोड़ा गया पाइप)


1

grep -A 10 <पैटर्न>

यह पैटर्न और पैटर्न के बाद अगली 10 लाइनों को हथियाने के लिए है। यह केवल एक ज्ञात पैटर्न के लिए अच्छी तरह से काम करेगा, यदि आपके पास एक ज्ञात पैटर्न "सिर" सुझावों का उपयोग नहीं है।


1
हालांकि यह सही हो सकता है। उत्तर को अधिक व्यापक बनाने के लिए प्रश्न का अधिक विवरण जोड़ें।
प्रमोद एस। निकम

3
यह पूरी तरह से अलग प्रश्न का उत्तर देता है और इस संदर्भ में उपयोगी नहीं है।
प्री १०

-1

मुझे एक समान समस्या थी और उपरोक्त सभी समस्या पूरी तरह से हल नहीं होती है। मुझे मेल लाइनों वाली फ़ाइल नाम प्राप्त करने में भी दिलचस्पी है। मेरा समाधान:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

NB: मेरे मामले में पैटर्न हमेशा पहली पंक्ति से मेल खाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.