मैं टर्मिनल आउटपुट को फ़ाइल में कैसे सहेजूं?

मैं किसी कमांड के आउटपुट को फ़ाइल में कैसे सहेजूं?

क्या किसी सॉफ्टवेयर का उपयोग किए बिना कोई तरीका है? मैं जानना चाहूंगा कि कैसे ।

हां यह संभव है, बस आउटपुट (उर्फ) को पुनर्निर्देशित करें stdout) एक फ़ाइल के लिए:

SomeCommand > SomeFile.txt  

या यदि आप डेटा जोड़ना चाहते हैं:

SomeCommand >> SomeFile.txt

अगर आप चाहते हैं stderr साथ ही इसका उपयोग करें:

SomeCommand &> SomeFile.txt  

या यह संलग्न करने के लिए:

SomeCommand &>> SomeFile.txt  

यदि आप दोनों चाहते हैं stderr और आउटपुट कंसोल पर प्रदर्शित और एक फ़ाइल में इसका उपयोग करें:

SomeCommand 2>&1 | tee SomeFile.txt

(यदि आप केवल आउटपुट चाहते हैं, तो ड्रॉप करें 2 ऊपर)

किसी फ़ाइल में कमांड के आउटपुट को लिखने के लिए, मूल रूप से 10 आमतौर पर उपयोग किए जाने वाले तरीके हैं ।

अवलोकन:

कृपया ध्यान दें कि n.e. सिंटैक्स कॉलम में "मौजूदा नहीं"का अर्थ है ।
एक रास्ता है, लेकिन कॉलम में फिट होना बहुत जटिल है । आप इसके बारे में सूची अनुभाग में एक उपयोगी लिंक पा सकते हैं ।

          || visible in terminal ||   visible in file   || existing  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   ==========++==========+==========++==========+==========++===========    >     ||    no    |   yes    ||   yes    |    no    || overwrite    >>    ||    no    |   yes    ||   yes    |    no    ||  append          ||          |          ||          |          ||   2>     ||   yes    |    no    ||    no    |   yes    || overwrite   2>>    ||   yes    |    no    ||    no    |   yes    ||  append          ||          |          ||          |          ||   &>     ||    no    |    no    ||   yes    |   yes    || overwrite   &>>    ||    no    |    no    ||   yes    |   yes    ||  append          ||          |          ||          |          || | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append          ||          |          ||          |          || n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append          ||          |          ||          |          |||& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

सूची:

  • command > output.txt

    मानक आउटपुट स्ट्रीम को केवल फ़ाइल पर पुनर्निर्देशित किया जाएगा, यह टर्मिनल में दिखाई नहीं देगा । यदि फ़ाइल पहले से मौजूद है, तो यह अधिलेखित हो जाती है ।

  • command >> output.txt

    मानक आउटपुट स्ट्रीम को केवल फ़ाइल पर पुनर्निर्देशित किया जाएगा, यह टर्मिनल में दिखाई नहीं देगा । यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में जुड़ जाएगा ।

  • command 2> output.txt

    मानक त्रुटि स्ट्रीम केवल फ़ाइल पर पुनर्निर्देशित की जाएगी, यह टर्मिनल में दिखाई नहीं देगी । यदि फ़ाइल पहले से मौजूद है, तो यह अधिलेखित हो जाती है ।

  • command 2>> output.txt

    मानक त्रुटि स्ट्रीम केवल फ़ाइल पर पुनर्निर्देशित की जाएगी, यह टर्मिनल में दिखाई नहीं देगी । यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में जुड़ जाएगा ।

  • command &> output.txt

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

  • command &>> output.txt

    मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को केवल फ़ाइल पर पुनर्निर्देशित किया जाएगा, टर्मिनल में कुछ भी दिखाई नहीं देगा । यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में जुड़ जाएगा । .

  • command | tee output.txt

    मानक आउटपुट स्ट्रीम को फ़ाइल में कॉपी किया जाएगा, यह अभी भी टर्मिनल में दिखाई देगा । यदि फ़ाइल पहले से मौजूद है, तो यह अधिलेखित हो जाती है ।

  • command | tee -a output.txt

    मानक आउटपुट स्ट्रीम को फ़ाइल में कॉपी किया जाएगा, यह अभी भी टर्मिनल में दिखाई देगा । यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में जुड़ जाएगा ।

  • (*)

    बैश में कोई शॉर्टहैंड सिंटैक्स नहीं है जो केवल दूसरे कमांड को पाइपिंग करने की अनुमति देता है, जिसकी आवश्यकता यहां संयोजन में होगी tee फिर से तालिका को पूरा करने के लिए । अगर आपको वास्तव में ऐसा कुछ चाहिए, तो कृपया देखें "कैसे करने के लिए पाइप stderr, और नहीं stdout?"स्टैक ओवरफ्लो पर कुछ तरीकों से यह कैसे किया जा सकता है जैसे धाराओं को स्वैप करके या प्रक्रिया प्रतिस्थापन का उपयोग करके ।

  • command |& tee output.txt

    टर्मिनल में दिखाई देने के दौरान मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को फ़ाइल में कॉपी किया जाएगा । यदि फ़ाइल पहले से मौजूद है, तो यह अधिलेखित हो जाती है ।

  • command |& tee -a output.txt

    टर्मिनल में दिखाई देने के दौरान मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को फ़ाइल में कॉपी किया जाएगा । यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में जुड़ जाएगा ।

आप भी उपयोग कर सकते हैं tee आउटपुट को फ़ाइल में भेजने के लिए:

command | tee ~/outputfile.txt

एक मामूली संशोधन एसटीडीआरआर को भी पकड़ लेगा:

command 2>&1 | tee ~/outputfile.txt

या थोड़ा छोटा और कम जटिल:

command |& tee ~/outputfile.txt

tee यदि आप सक्षम होना चाहते हैं तो उपयोगी है इसे लाइव देखते हुए कमांड आउटपुट कैप्चर करें.

आप कमांड आउटपुट को फ़ाइल में रीडायरेक्ट कर सकते हैं:

your_command >/path/to/file

कमांड आउटपुट को ओवरराइट करने के बजाय फ़ाइल में जोड़ने के लिए, उपयोग करें:

your_command >>/path/to/file

विचार करने के लिए एक वृद्धि -

विभिन्न स्क्रिप्ट आउटपुट में रंग कोड इंजेक्ट करेंगे जो आप अपनी लॉग फ़ाइल को अव्यवस्थित नहीं करना चाहते हैं ।

इसे ठीक करने के लिए आप प्रोग्राम का उपयोग कर सकते हैं sed उन कोड को पट्टी करने के लिए । उदाहरण:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

यहां दो अलग-अलग सवाल हैं । पहला शीर्षक में है:

मैं टर्मिनल आउटपुट को फ़ाइल में कैसे सहेजूं?

दूसरा सवाल शरीर में है:

मैं किसी कमांड के आउटपुट को फ़ाइल में कैसे सहेजूं?

यहां पोस्ट किए गए सभी उत्तर दूसरे प्रश्न को संबोधित करते हैं लेकिन कोई भी पहले प्रश्न को संबोधित नहीं करता है जिसमें एक महान उत्तर है यूनिक्स में & लिनक्स:

यह उत्तर एक छोटे से ज्ञात कमांड का उपयोग करता है जिसे कहा जाता है script जो आपके सभी शेल के आउटपुट को टेक्स्ट फ़ाइल में तब तक सहेजता है जब तक आप टाइप नहीं करते exit. कमांड आउटपुट अभी भी आपकी स्क्रीन पर दिखाई देता है लेकिन पाठ फ़ाइल में भी दिखाई देता है.

प्रक्रिया सरल है । उपयोग करें:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

फिर कमांड 1, 2 और 3 के अपने रिकॉर्ड किए गए आउटपुट को देखें:

cat ~/outputfile.txt

यह समान है पहले जवाब का:

command |& tee ~/outputfile.txt
  • लेकिन आपको उपयोग नहीं करना है |& tee ~/outputfile.txt प्रत्येक के बाद commnd.
  • script कमांड ने पुनः लोड करने का लाभ (या नुकसान) जोड़ा है ~/.bashrc जब यह शुरू होता है ।
  • script कमांड कमांड प्रॉम्प्ट दिखाता है ($PS1) आपके द्वारा दर्ज किए गए कमांड(ओं) के बाद ।
  • script कमांड सभी विवरणों को पूरे रंग में रिकॉर्ड करता है ।

के लिए cron नौकरियां आदि आप बैश एक्सटेंशन से बचना चाहते हैं । बराबर POSIX sh पुनर्निर्देशन ऑपरेटर हैं

Bash          POSIX------------  --------------foo &> bar    foo >bar 2>&1foo &>> bar   foo >>bar 2>&1foo |& bar    foo 2>&1 | bar

आप देखेंगे कि पॉज़िक्स सुविधा कुछ अर्थों में सरल और अधिक सीधी है । द &> सिंटैक्स से उधार लिया गया था csh जो आपको पहले से ही समझा देना चाहिए कि यह एक बुरा विचार है ।

some_command | tee command.log और some_command > command.log समस्या यह है कि वे कमांड आउटपुट को सहेजते नहीं हैं command.log वास्तविक समय में फ़ाइल।

उस समस्या से बचने और वास्तविक समय में कमांड आउटपुट को सहेजने के लिए, आप संलग्न कर सकते हैं unbuffer, जो के साथ आता है expect पैकेज.


उदाहरण:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

मान लेना log.py शामिल हैं:

import timeprint('testing')time.sleep(100) # sleeping for 100 seconds

आप चला सकते हैं unbuffer python log.py | tee command.log या unbuffer python log.py > command.log

अधिक जानकारी: मैं वास्तविक समय में किसी फ़ाइल में कमांड आउटपुट कैसे बचा सकता हूं?

यदि आप कमांड चलाते समय फ़ाइल में आउटपुट करना चाहते हैं:

script -c ./path/to/executable.bash -f log.txt