2009-09-14 15 views
5

क्या सभी पैटर्न की एक सूची प्राप्त करने के लिए grep (या अन्य मानक कमांड लाइन टूल्स के साथ गठबंधन) का उपयोग करने का कोई आसान तरीका है जिसमें अभी तक एक पैटर्न नहीं है?grep का उपयोग उन सभी फ़ाइलों को खोजने के लिए कैसे करें जिनमें एक पैटर्न है लेकिन दूसरा नहीं है?

मेरी विशिष्ट मामले में मैं सभी फ़ाइलें पैटर्न होते हैं की एक सूची चाहते हैं:

override.*commitProperties 

अभी तक शामिल नहीं है:

super.commitProperties 

मैं Windows पर हूँ लेकिन cygwin बड़े पैमाने पर इस्तेमाल करते हैं। मुझे पता है कि या तो पहले पैटर्न या सभी पैटर्न के साथ सभी फ़ाइलों को कैसे ढूंढें, लेकिन मुझे यकीन नहीं है कि उन प्रश्नों को कैसे गठबंधन किया जाए।

मैं जवाब है कि जेनेरिक कर रहे हैं, के रूप में मैं अन्य लोगों की भावना बहुत है उपयोगी क्वेरी के इस प्रकार मिल सकता है पसंद करेंगे। मेरे लिए एक सामान्य समाधान लेने और मेरे मूल्यों में प्लग करने के लिए यह काफी आसान है। स्पष्टीकरण को आसान बनाने के लिए मैंने अभी अपना विशिष्ट उदाहरण शामिल किया है।

+0

क्या आप दूसरे पैटर्न के पहले पैटर्न मिलान आउटपुट को पाइप करते हैं और फिर दूसरे पैटर्न के लिए एक grep करते हैं? – vpram86

+1

नहीं - पैटर्न विभिन्न लाइनों पर हो सकते हैं – DVK

+0

@ DVk-Oh !!! :) मैं वह भूल गया। आपका बहुत बहुत धन्यवाद! – vpram86

उत्तर

10
grep -rl "override.*commitProperties" . | xargs grep -L "super.commitProperties" 

-l एक मैच के साथ फ़ाइलें प्रिंट

-L प्रिंट एक मैच

+0

यह एक और hlovdal दोनों काम करता है, लेकिन मुझे यह थोड़ा और अधिक पसंद है क्योंकि यह आसान है। – Herms

+0

बुराई कोड खोजने के लिए grep कर रहे किसी के क्रोध से बचने के लिए "superXcommitProperties" को कॉल करके धोखा दे सकता है ;-) –

+0

बुरा कोड? नहीं नहीं। यह मेरे लिए एक मामला है जो कुछ जगहों पर मेरे ओवरराइड को सुपर कॉल जोड़ना भूल जाता है, जिससे अजीब चीजें होती हैं। मैंने पहले से ही खुद को ठीक से पीटा है, अब मैं सिर्फ उन सभी स्थानों की खोज कर रहा हूं जिन्हें मैंने खराब कर दिया है, इसलिए मैं इसे ठीक कर सकता हूं। :) – Herms

4

प्रयास करें

find . -print0 | xargs -0 grep -l "override.*commitProperties" \ 
| tr '\012' '\000' | xargs -0 grep -L super.commitProperties 

tr आदेश, अशक्त ASCII करने के लिए, ताकि आप दूसरे xargs में -0 उपयोग कर सकते हैं नई-पंक्तियों में परिवर्तित कर देंगे फ़ाइल नाम आदि

टेस्ट परिणाम में रिक्तियों के साथ सभी मुद्दों से परहेज:

/tmp/test>more 1 2 3 | cat 
:::::::::::::: 
1 
:::::::::::::: 
override.*commitProperties 
super.commitProperties 
:::::::::::::: 
2 
:::::::::::::: 
override.*commitProperties 
:::::::::::::: 
3 
:::::::::::::: 
hello world 
/tmp/test>find . -print0 | xargs -0 grep -l "override.*commitProperties" | tr '\012' '\000' | xargs -0 grep -L super.commitProperties 
./2 
/tmp/test> 

डगलस द्वारा बताया गया है, + xargs grep -r द्वारा प्रतिस्थापित किया जा जा सकता है पाते हैं।

+0

यह काफी कुछ है जो मैंने सुझाया होगा, सिवाय इसके कि मैंने खोजने के बजाय rep -r का उपयोग किया होगा। –

+0

क्या आप कुछ विवरण जोड़ सकते हैं कि प्रत्येक कमांड क्या कर रहा है? मुझे लगता है और grep मिलता है, लेकिन tr क्या कर रहा है? – Herms

+0

इसके अलावा, क्यों खोज? grep -r पथ को दोबारा जोड़ता है और इसे आसान बनाता है। क्या कुछ चीजों को चीजों को बेहतर तरीके से काम करने में मदद मिलती है? – Herms

2

निम्नानुसार 2 greps और एक कॉम का संयोजन उपयोग करें (पैटर्न ए और बी हैं)। कृपया ध्यान दें कि एक पाइप grep काम नहीं करेगा क्योंकि पैटर्न अलग-अलग लाइनों पर हो सकते हैं।

$ cat a 
A 
$ cat b 
B 
$ cat ab 
A 
B 

$ grep -l A * > A.only 
$ grep -l B * > B.only 

$ comm -23 A.only B.only 
a 

नोट: कॉम आदेश प्रिंट लाइनों के लिए आम या दो फ़ाइलों के लिए अद्वितीय। "-23" प्रिंट पहली पंक्तियों के लिए अनन्य लाइनें - इस प्रकार दूसरी फ़ाइल में फ़ाइल नाम दबाने।

+2

पहले कमांड कमांड में कभी नहीं चला। मुझे इस स्थिति के लिए grep समाधान बेहतर पसंद है क्योंकि इसे अतिरिक्त फ़ाइलों की आवश्यकता नहीं है जिन्हें मैं हटाना भूल जाऊंगा, लेकिन मुझे खुशी है कि आपने इसे पोस्ट किया है। नए आदेशों के बारे में जानने के लिए हमेशा अच्छा है। – Herms

+0

मैं गलत हो सकता हूं लेकिन मुझे लगता है कि आपके द्वारा प्राप्त की गई प्रत्येक फाइल के लिए पहला समाधान (xargs के साथ) MANY grep कमांड निष्पादित करेगा। मामूली कॉन्फ़िगरेशन फ़ाइल जांच के लिए कोई समस्या नहीं होने पर, यदि आपको कई grep बाल प्रक्रियाओं को लॉन्च करके फ़ाइलों के बहुत बड़े सेट पर एक ही तर्क करने की आवश्यकता होती है, तो यह एक प्रमुख संसाधन नाली होगी। – DVK

+0

स्वीकार्य समाधान पर मेरी टिप्पणी देखें। मुझे विश्वास नहीं है कि 2 से अधिक greps वास्तव में लॉन्च किया जाएगा। – Herms

2

मेरे समाधान, डगलस Leeder के लिए समान है, सिवाय मैं xargs का उपयोग नहीं करते बिना फ़ाइलों:

grep -l 'override.*commitProperties' $(grep -L super.commitProperties *.txt) 

grep -L कमांड उत्पाद उन फ़ाइलों की एक सूची है जिनमें पाटर नहीं है n super.commitProperties, grep -l कमांड * ओवरराइड के लिए दिखता है। उस सूची से प्रतिबद्धप्रॉपर्टी पैटर्न।

कुल मिलाकर, यह बिल्ली को त्वचा के लिए एक अलग तरीका है।

+0

मैं उस वाक्यविन्यास से परिचित नहीं हूं। $() क्या कर रहा है? – Herms

+0

$ (कमांड) वाक्यविन्यास अनिवार्य रूप से पिछला उद्धरण वाक्यविन्यास है: 'आदेश'। खोल अपने आउटपुट के साथ $ (कमांड) या 'कमांड) को बदल देता है। अधिक जानकारी के लिए आप "बैश कमांड प्रतिस्थापन" पर जा सकते हैं –

1

ack -l --make "override.*commitProperties" | xargs ack -L "super.commitProperties"

मैं इस सूत्र का इस्तेमाल किया और एक पुनरावर्ती देखने करने के लिए कोशिश कर रहा था।इसमें 25 मिनट लग गए थे, इसलिए इसके बारे में ack के बारे में पता चला। यह 5 मिनट में किया था।

हैंडी टूल ack

0
grep "override.*commitProperties" *| grep -v "super.commitProperties" | cut -d":" -f1 
संबंधित मुद्दे

 संबंधित मुद्दे