एक फ़ाइल से grep पैटर्न पढ़ना


49

मेरे पास कुछ बड़ी पाठ फ़ाइलें हैं और फ़ाइल में UNIQS.txtमेरे पास किसी grepअन्य फ़ाइल से स्ट्रिंग की सूची है । मेरे द्वारा उपयोग किया जाने वाला कोड है

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

जो कुछ भी नहीं करता है - उत्पन्न फ़ाइल खाली है। लेकिन जब मैं करता हूं

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

यह सही ढंग से काम करता है। यह मुझे भ्रमित करता है क्योंकि मुझे नहीं लगता था कि उद्धरण और स्लैश के बिना रीगेक्सप पैटर्न grepमें प्रविष्टियों की व्याख्या की जाएगी UNIQS.txtऔर इसलिए फाइल में होने पर (जो वहां नहीं हैं)। क्या यह सामान्य रूप से ऐसा है कि यदि आप किसी फ़ाइल से पैटर्न प्राप्त कर रहे हैं तो यह स्वचालित रूप से सोचेगा कि वे regexp पैटर्न हैं?

संपादित करें: में UNIQS.txtफ़ाइल, वहाँ फार्म के न्यू लाइन अलग तार कर रहे हैं

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(टेम्प्लेट नाम कहा जाता है) और फ़ाइल EEP_VSL...टैब अलग-अलग कॉलम होते हैं, लगभग 14 कॉलम और पहला कॉलम टेम्पलेट नाम होता है, इसलिए मूल रूप से मैं फ़ाइल में प्रत्येक टेम्पलेट के अनुरूप लाइन निकालना चाहता हूं।

जवाबों:


60

-fविकल्प के लिए एक फ़ाइल जहां ग्रेप पैटर्न पढ़ता निर्दिष्ट करता है। यह कमांड लाइन पर पैटर्न को पास करने जैसा है ( -eयदि विकल्प एक से अधिक है तो), सिवाय इसके कि जब आप किसी शेल से कॉल कर रहे हों, तो आपको शेल द्वारा विस्तारित होने से इसमें विशेष वर्णों की सुरक्षा के लिए पैटर्न को कोट करना पड़ सकता है।

तर्क -Eया -Fया -P, यदि कोई हो, तो grep बताता है कि कौन से वाक्यविन्यास पैटर्न लिखे गए हैं। बिना किसी तर्क के, grep कुछ नियमित अभिव्यक्तियों की अपेक्षा करता है ; के साथ -E, grep ने नियमित अभिव्यक्तियों की अपेक्षा की ; साथ -P(यदि समर्थित), ग्रेप उम्मीद पर्ल नियमित अभिव्यक्ति ; और -F, grep शाब्दिक तार की अपेक्षा करता है। कमांड लाइन से पैटर्न आता है या फाइल से कोई फर्क नहीं पड़ता।

ध्यान दें कि तार सबस्ट्रिंग हैं: यदि आप a+bएक पैटर्न के रूप में गुजरते हैं तो एक लाइन युक्त a+b+cमिलान होता है। यदि आप आपूर्ति किए गए स्ट्रिंग्स में से एक और अधिक नहीं वाली लाइनों की खोज करना चाहते हैं, तो -xविकल्प पास करें ।


1
ठीक है कि उपयोगी धन्यवाद है। क्या मैं यह पूछ सकता हूं कि मान लें कि मैं स्ट्रिंग का मिलान ठीक तरह से करना चाहता था, यानी यदि स्ट्रिंग 12345 है, तो मैं चाहता हूं कि यह केवल 12345 पर मेल खाए, न कि 123456 या 123455 आदि पर, मैं यह करने के बारे में कैसे जाऊंगा?
एसडीएफ

2
@sdf मेरा आखिरी पैराग्राफ पढ़ें:-x
गिल्स

यह बहुत पुराना है, इसे खोदने के लिए खेद है। हालांकि उपरोक्त स्पष्टीकरण भयानक है, यह थोड़ा अस्पष्ट है कि फ़ाइल से पैटर्न (तार) -Fझंडे के बिना मेल क्यों नहीं खाते । मेरा अनुमान है कि -ऊपर की नमूना रेखा में यह वर्णों के अनुक्रम के रूप में पढ़ा जा सकता है? क्या वर्ग कोष्ठक की भी आवश्यकता नहीं होगी? मैंने कुछ नमूना फ़ाइलों के साथ परीक्षण किया है, लेकिन किसी निष्कर्ष पर नहीं आया हूं।
टीआरएस

@trs प्रश्न में दर्शाई गई रेखा (जो मेरे उत्तर पोस्ट करने के बाद जोड़ी गई थी) में कोई भी ऐसा अक्षर नहीं है जिसका विशेष अर्थ है, जो कि रेग्जैक्स में एक विशेष अर्थ रखता है, इसलिए यह उसी के साथ और उसके बिना भी व्यवहार करता है -F। इससे पात्रों के साथ फर्क पड़ता \[*^$
गाइल्स का SO- बुराई होना बंद हो '

@ धन्यवाद धन्यवाद, यह मेरी धारणा थी, लेकिन @sdf का दावा है "उत्पन्न फ़ाइल खाली है" (पढ़ें: कोई मेल नहीं) -Fझंडे के बिना ?
टीआरएस

0

मेरे पास एक ही त्रुटि थी, @gilles के अच्छे उत्तर से हल नहीं हुई। इनपुट फ़ाइल में करीब से देखने पर, मुझे अंत में 2 नए समाचार मिले। इनके बिना, सफलता, केवल जरूरत है: grep -i file_pattern_input फ़ाइल

(GNU grep 3.1, 5000 से अधिक रिकॉर्ड्स की इनपुट फ़ाइल, मिलान / पैटर्न फ़ाइल 2536, मुझे पता था कि सभी 2536 को फ़ाइल में होना चाहिए। नई लाइनों के साथ फ़ाइल की सभी लाइनें और केवल 2536 मिलान लाइनों के बिना)


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