यह grep कमांड काम क्यों नहीं करता है?


24

जब मैं इस तरह से क्रेप का उपयोग करने की कोशिश करता हूं:

service --status-all | grep network

यह अभी भी सभी सेवाओं को सूचीबद्ध करता है, भले ही मैंने इसे grepकेवल "नेटवर्क" स्ट्रिंग तक सीमित करने के लिए इसे पाइप किया था


तथ्य के बाद:

इस लेख को नोट किया गया है जो बताता है कि कमांड इस तरह से व्यवहार करता है, यही कारण है कि मुझे लिनक्स के बारे में पसंद है, हमेशा एक अच्छा कारण है, लेकिन आवश्यक सहज नहीं है

जवाबों:


41

प्रयत्न:

service --status-all |& grep network

कमांड-लाइन एप्लिकेशन दो पाठ धाराओं को मानक आउट (stdout) और मानक त्रुटि (stderr) के रूप में प्रिंट कर सकते हैं । डिफ़ॉल्ट रूप से, टर्मिनल सिर्फ दोनों के लिए आउटपुट को समान रूप से प्रदर्शित करता है।

Stdout को नंबर 1 दिया गया है, और Stderr को नंबर 2 दिया गया है। डिफ़ॉल्ट रूप से, पुनर्निर्देशन ऑपरेटर, जैसे >, |और <केवल stdout, नंबर 1 पर लागू होते हैं।

|&सही मानक इनपुट (स्टडिन) स्ट्रीम पर प्रक्रिया के लिए स्टैडआउट और स्टेडर दोनों को एक साथ पाइप करता है, जो grepआपकी अपेक्षा के अनुरूप काम करता है।

मुझे नहीं पता कि service --status-allयहां स्टादर को क्यों छापा जा रहा है, लेकिन सामान्य तौर पर, एक अलग स्टेडर स्ट्रीम होना बहुत उपयोगी है, क्योंकि यह आपको स्टडआउट के खामोश होने पर भी त्रुटियों को देखने देता है।


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

4

आपको मानक त्रुटि स्ट्रीम ( 2) से मानक आउटपुट ( 1) तक पुनर्निर्देशित करने की आवश्यकता है :

service --status-all 2>&1 | grep network

ऑपरेटर >आमतौर पर फ़ाइल (जैसे 2>/tmp/file) पर पुनर्निर्देशित करता है । डिस्क्रिप्टर का उपयोग करके अन्य स्ट्रीम पर पुनर्निर्देशित करने के लिए , इसे पूर्ववर्ती करने की आवश्यकता है &(वर्णों के बीच कोई रिक्त स्थान नहीं है)।

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