एक आउटपुट में कई यूनिक्स कमांड को मिलाएं


9

मुझे एक विशिष्ट ई-मेल पते के लिए हमारे मेल लॉग को खोजने की आवश्यकता है। हम एक मौजूदा फ़ाइल को एक ही फ़ोल्डर में एक सप्ताह के लायक .bz2 फ़ाइलों के साथ-साथ एक मौजूदा फ़ाइल रखते हैं । वर्तमान में, मैं फ़ाइल के लिए खोज करने के लिए निम्नलिखित कमांड चला रहा हूं:

grep person@domain.com maillog
bzgrep person@domain.com *.bz2

वहाँ एक रास्ता है grepऔर bzgrepएक ही उत्पादन में आदेशों को जोड़ती है ? इस तरह, मैं एक एकल ई-मेल या एक फ़ाइल में संयुक्त परिणामों को पाइप कर सकता हूं।

जवाबों:


24

दूसरा तरीका है

{ grep ...; bzgrep ...;} >file

&&bzgrepयदि grepअसफल रहा तो कठिनाई नहीं होगी ।

अंतिम आदेश के बाद कर्ली ब्रेस और अर्धविराम के बाद अनिवार्य स्थान पर ध्यान दें। वैकल्पिक रूप से, आप सबसाइल सिंटैक्स (घुंघराले ब्रेसिज़ के बजाय कोष्ठक) का उपयोग कर सकते हैं, जो कि पिकी के रूप में नहीं है:

(grep ...; bzgrep ...) >file

इस मुद्दे के लिए सबसे अच्छा सामान्य उद्देश्य खोल दृष्टिकोण के लिए +1। शेल ग्रुपिंग एक सामान्य रूप से रेखांकित विशेषता है।
फिल हॉलेनबैक

2
क्या आपको ()इसके बजाय मतलब नहीं है {}?
एहतेश चौधरी

आर्क लिनेक्स पर इस के साथ काम किया, ()लेकिन {}या तो +1 नहीं किया क्योंकि यह वही है जो मुझे चाहिए था!
क्रिस मैग्नसन

11

bzgrep स्वचालित रूप से नियमित grep के लिए डिफॉल्ट करता है यदि कोई फ़ाइल bzip- संपीड़ित नहीं है। इस प्रकार निम्नलिखित पर्याप्त होना चाहिए:

bzgrep person@domain.com maillog *bz2 | mail -s "logs yay" someuser@blah

ओह, यहाँ भी मेरे अनिवार्य GNU समानांतर समाधान है:

parallel -m bzgrep person@domain.com ::: maillog* *bz2 | mail -s "logs yay" someuser@blah

यदि आप बहुत अधिक फ़ाइलों की जाँच कर रहे हैं, तो यह बहुत तेज़ हो सकता है।


2

इसे करने का एक और तरीका है (यह मानते हुए कि आप शायद चला रहे हैं, जो आप कर रहे हैं):

cat <(bzgrep ...) <(grep ...)

यहाँ बैश पारदर्शी रूप से कैट और grep कमांड्स के आउटपुट को कैट में फीड कर रहा है जैसे कि वे फाइल थे (और वे हुड के नीचे हैं, नीचे url में विवरण)।

आपके विशेष मामले में मैं फिल के समाधान की सिफारिश करूंगा, लेकिन उपरोक्त आपके बैग में रखने के लिए एक अच्छी चाल है।

यदि आप रुचि रखते हैं, तो आप यहाँ और अधिक पढ़ सकते हैं: http://www.tldp.org/LDP/abs/html/process-sub.html


आह, 'दो प्रक्रियाओं के आउटपुट को कैसे अलग करते हैं' के लिए विहित उत्तर। जानने के लिए एक अच्छी ट्रिक।
फिल होलेनबैक

1

मेरे लेखन के समय, स्वीकृत उत्तर का सिंटैक्स अधिकांश के लिए गलत था, यदि सभी नहीं, बॉर्न-व्युत्पन्न गोले, सहित bash। मैंने शीर्ष को संपादित करने का सुझाव दिया और इसे ठीक करने के लिए उत्तर दिया, लेकिन मैं यह सब अन्य जानकारी जोड़ने के लिए भी इच्छुक था, और यह एक संपादन के बजाय एक फिर से लिखना होगा।

आप कंपाउंड कमांड का उपयोग कर सकते हैं:

{ grep ...; bzgrep ...; } >file

.. के लिए सब-सब्सक्रिप्शन (घुंघराले ब्रेसिज़ के बजाय कोष्ठक पर ध्यान दें):

(grep ...; bzgrep ...) >file

.. आज्ञाओं को समूह। उप-स्तरीय तरीके में अच्छे वाक्यविन्यास हैं (व्हॉट्सएप की कमी के अधिक क्षमा करने और आपको अंतिम अर्धविराम को छोड़ने की अनुमति देता है), लेकिन यह या तो एक नई प्रक्रिया की तलाश करता है, या आदेशों को स्वच्छ वातावरण में चलाने के लिए "ढोंग" करता है। आप जो करना चाहते हैं, उसके आधार पर दोनों के फायदे हैं, जो यहां कोई फर्क नहीं पड़ता, लेकिन अगर आप शेल के साथ अधिक प्रवीणता चाहते हैं, तो यह देखने लायक है।

नोट: आप इन ट्रिक्स के साथ भी पाइपलाइनिंग का उपयोग कर सकते हैं, ताकि आप कुछ इस तरह से कर सकें:

{ grep ...; bzgrep ...; } | less

पुनश्च यदि आप अपने संयुक्त आउटपुट में मैचों के आदेश के बारे में परवाह नहीं करते हैं, तो आप &दो कमांडों के बीच एक का उपयोग कर सकते हैं , जैसे { grep ... & bzgrep ...; }:। फिर दो कमांड एक साथ चलते हैं: grepलॉन्च हो जाता है और शेल इसे पृष्ठभूमि में रखता है, फिर शेल रन करेगा bzgrep। (लेकिन फ़ाइल पुनर्निर्देशन और फ़ाइल स्ट्रीम बफ़रिंग को शामिल करने वाले स्पष्टीकरण के साथ एक छोटा सा कैविएट है, जो आउटपुट फ़ाइल में लाइनों के एक बहुत छोटे हिस्से को संभावित रूप से विभाजित / विभाजित करने का कारण बनता है: क्या आप देखेंगे कि यह इस पर निर्भर करेगा कि आपका grep, bzgrep, और libc stdio.hफ़ंक्शंस कार्यान्वित किए जाते हैं। अधिकांश कार्यान्वयन में, मेरा मानना ​​है कि फ़ाइल पर रीडायरेक्ट करने से पहले कमांड को पाइप करने से समस्या से बचा जा सकता है, इसलिए आप { foo & bar; } | cat - >fileवर्कअराउंड के रूप में कर सकते हैं ।)


0

आप && के साथ आदेशों को एक साथ जोड़ सकते हैं जो आपको प्रत्येक कमांड को चलाने की अनुमति देगा।

आप प्रत्येक कमांड के अंत में >> textfile.txt भी जोड़ सकते हैं और आउटपुट में एक फ़ाइल हिट होती है, फिर उस फ़ाइल को मेल करें।


2
जैसा कि geekosaur ने उल्लेख किया है, && का उपयोग यहां नहीं किया जाना चाहिए क्योंकि grep का वापसी मूल्य इस बात पर निर्भर करता है कि यह कुछ मिला या नहीं। अगर आपने किया grep ... && bzgrep ..., अगर grep में कोई हिट नहीं थी , तो यह विफलता लौटेगी और कमांड बंद हो जाएगी। >>एक अच्छा विचार है, हालांकि, इसके विपरीत >, यह एक मौजूदा फ़ाइल के अंत में आउटपुट जोड़ देगा।
DerfK

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