खोजने के लिए त्रुटियों को फ़िल्टर करने के लिए पाइप और ampersand के साथ grep का उपयोग करना


22

मैं cygdrive पर एक फ़ाइल खोजने के लिए cygwin का उपयोग कर रहा हूँ।

हालाँकि मुझे अनुमति से वंचित संदेशों को दबाने की आवश्यकता है (अन्यथा परिणाम त्रुटि संदेशों में छिपे हुए हैं)। निम्न आदेश काम करता है:

find -name 'myfile.*' |& grep -v "Permission denied"

मुझे समझ में नहीं आता है कि एम्परसैंड को इस कमान में डालने की आवश्यकता क्यों है, इसने काम करने की उम्मीद की होगी, लेकिन ऐसा नहीं है।

find -name 'myfile.*' | grep -v "Permission denied"

कृपया एम्परसेंड का अर्थ स्पष्ट करें।

जवाबों:


24

यूनिक्स जैसी प्रणालियों में, दो आउटपुट पथ होते हैं जो यदि छोड़ दिए जाते हैं तो अनमॉडिफाइड आपकी स्क्रीन पर आउटपुट भेजेंगे। मानक त्रुटि (या stderr) वह है जो अधिकांश विफलताओं और त्रुटि स्थितियों को पकड़ती है।

"नियमित आउटपुट" के रूप में एक ही आउटपुट स्ट्रीम में stderr में अनुमति अस्वीकृत संदेश को पास करने के लिए आपको दोनों को संयोजित करना होगा। आपके उदाहरण में, आपके grep -vद्वारा उस पर ठीक से काम करने के लिए , आप स्टैडआउट (मानक आउटपुट) और स्टेंडर को आपके द्वारा देखे जाने वाले आर्कियन सिंटैक्स के साथ जोड़ते हैं।

से जीएनयू बैश मैनुअल खंड 3.2.2 पाइपलाइन :

यदि ' |&' का उपयोग किया जाता है, तो कमांड मानक मानक त्रुटि, इसके मानक आउटपुट के अलावा, पाइप के माध्यम से कमांड 2 के मानक इनपुट से जुड़ा है ; इसके लिए आशुलिपि है 2>&1 |। मानक आउटपुट में मानक त्रुटि का यह निहित पुनर्निर्देशन कमांड द्वारा निर्दिष्ट किसी भी पुनर्निर्देशन के बाद किया जाता है।

इसके अलावा, जैसा कि जिरहा बताते हैं, अगर आप सिर्फ स्टैडर आउटपुट से छुटकारा चाहते हैं, तो आप कुछ ऐसा करना चाहेंगे

find -name 'myfile.*' 2> /dev/null

या शायद

find -name 'myfile.*' 2> /tmp/errorlog

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

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

यदि आपने कोष्ठक को छोड़ दिया, और इसके बजाय यह किया -

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

आप अभी भी खोज या egrep से अनुमति से वंचित त्रुटियों को देखेंगे, लेकिन स्टैडर को xargs के लिए पुनर्निर्देशित किया जाएगा।

जैसा कि आपने देखा है, आप टेस्ट रन के दौरान इसकी सामग्री को देखने के बाद ही stderr को फेंक देंगे।

ध्यान दें कि GNU के साथ findऔर जहाँ तक मैं बता सकता हूँ, कोई भी POSIX- शिकायत find, -printविकल्प निहित है। यदि आप चाहें तो आप अभी भी इसे स्पष्ट रूप से आपूर्ति कर सकते हैं।



1
@LukeExton हाँ। अन्य गोले में, के 2>&1 |स्थान पर इस्तेमाल किया जा सकता है |&(यानी, एक व्यक्ति stdout को स्पष्ट रूप से पुनर्निर्देशित कर सकता है और फिर पाइप लाइन में अगले आदेश तक पाइप कर सकता है)।
एलियाह कगन

2> >( grep filter )यह भी उपयोगी है
user1133275


1

यदि आप त्रुटि संदेशों को अनदेखा करना चाहते हैं, तो बस stirectr को / dev / null में रीडायरेक्ट करें।

find . -name 'myfile.*' -print 2>/dev/null

इसके अलावा, http://mywiki.wooledge.org/UsingFind पढ़ने पर विचार करें ।

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