2013-02-14 47 views
16

मुझे grep कमांड के साथ कुछ समस्या है।एकाधिक फ़ाइलों पर grep खोज से पिछली पंक्ति प्राप्त करें

find . -name "FILE_NAME" | xargs -I name grep PATERN name 

:

grep PATERN FILE_NAME | tail -1 

मैं भी जिस तरह से कई चयनित फ़ाइलों में एक ग्रेप खोज बनाने के लिए लगता है:

मैं जिस तरह से केवल एक ग्रेप खोज की अंतिम पंक्ति को दिखाने के लिए मिल गया है अब मैं केवल प्रत्येक फ़ाइल के लिए grep परिणाम की अंतिम पंक्ति प्राप्त करना चाहता हूं।

find . -name "FILE_NAME" | xargs -I name grep PATERN name | tail -1 

यह मैं पिछले फ़ाइल जहाँ मैं हर फ़ाइल के लिए पिछले मिलान patern करना चाहते हैं की केवल पिछले मान देता है: मैं इस कोशिश की।

उत्तर

25
for f in $(find . -name "FILE_NAME"); do grep PATERN $f | tail -1; done 
+0

महान काम करता है! धन्यवाद! : डी –

+0

दुर्भाग्यवश, यदि आप पूरी फाइल खोज रहे हैं और अंतिम परिणाम लौट रहे हैं तो यह बड़ी फ़ाइलों या जटिल पैटर्न खोजों के लिए प्रभावी नहीं होगा? आपके लूप में निम्नलिखित की तरह कुछ कैसे: 'tac फ़ाइल | grep-m1 -oP '(? <=tag>)। * (?=) '| हेड-एन 1' या यहां तक ​​कि 'grep-m1 -oP '(? <=tag>)। * (? =)' << (टीएसी फ़ाइल) ' – kisna

2

यह कैसे अच्छा साहब

find . -name "FILE_NAME" -print0 | while read -d '' aa 
do 
    grep PATTERN "$aa" | tail -1 
done 
+0

पहली टिप्पणी की तुलना में एक ही भावना, पूरी तरह से काम करता है! –

0

आप भी आदेश पर अमल करने के लिए उपयोग कर सकते हैं के बारे में:

find . -name "<file-name-to-find>" -exec grep "<pattern-to-match>" "{}" ";" | tail -1 

"{}", फ़ाइल का नाम है, जब लेखन खोल globing और expasion साथ देखभाल कमांड

-1

लूप की आवश्यकता के बिना कोई समाधान है, यह ओपी चाहता है जो देता है।

find . -type f -exec sh -c "fgrep print {} /dev/null |tail -1" \; 

./tway.pl:print map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
./txml.py:   print("%s does not exist: %s\n" % (host, error)) 
./utils.py:print combine_dicts(a, b, operator.mul) 
./xml_example.py:print ET.tostring(root, method="text") 

tail -1 बिना तुलना में बहुत अधिक पंक्तियां फ़ाइल प्रति देता है, लेकिन इसके बाद के संस्करण काम करता है साबित होता है।

find . -type f -exec sh -c "fgrep print {} /dev/null" \; 

देता है:

./tway.pl:print map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
./txml.py:   print("%s resolved to --> %s\n" % (host, ip)) 
./txml.py:   print("%s does not exist: %s\n" % (host, error)) 
./utils.py:print "a", a 
./utils.py:print "b", b 
./utils.py:print combine_dicts(a, b, operator.mul) 
./xml_example.py: print ">>" 
./xml_example.py: print ET.tostring(e, method="text") 
./xml_example.py: print "<<" 
./xml_example.py:print ET.tostring(root, method="text") 

संपादित - हटाने/dev/बातिल यदि आप फ़ाइल नाम नहीं करना चाहती उत्पादन में शामिल थे।

-2

ऐसा करने का सबसे तेज़ तरीका फाइलों से पिछली 1 (या अधिक) लाइनों को आउटपुट प्राप्त करेगा और फिर उसके माध्यम से grep होगा। तो -

tail -1 filenames.* | grep "what you want to grep for" 
+2

अंतिम पंक्ति आवश्यक रूप से पैटर्न से मेल नहीं खाती है, इसलिए यह नहीं है फ़ाइल प्रति अंतिम मैच दिखाएं। –

-1

पिछले लाइन लगाने के लिए एक और तरीका है फ़ाइल और आउटपुट पहले मैच उल्टा करने के लिए है।

find . -name "FILE_NAME" | xargs -I name sh -c 'tac name|sed -n "/PATTERN/{p;q}"' 
0

आप grep के -b (पहले) पैरामीटर से शुरू कर सकते हैं। उदाहरण के लिए मैच से पहले 5 लाइनें प्राप्त करने के लिए:

[email protected] /etc/php5/apache2 $ grep -i -B5 timezone php.ini 
[CLI Server] 
; Whether the CLI web server uses ANSI color coding in its terminal output. 
cli_server.color = On 

[Date] 
; Defines the default timezone used by the date functions 
; http://php.net/date.timezone 
;date.timezone =