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


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

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


397
2018-02-14 19:49


मूल




जवाब:


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

someCommand > someFile.txt  

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

someCommand >> someFile.txt

अगर तुम चाहते हो stderr भी इसका इस्तेमाल करें:

someCommand &> someFile.txt  

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

someCommand &>> someFile.txt  

390
2018-02-14 19:52



ध्यान दें कि someCommand 2> someFile.txt तथा someCommand 2>> someFile.txt रीडायरेक्ट भी करता है stterr कुछ File.txt करने के लिए - Slothworks
मैं इसे जीसीसी कमांड के साथ करने की कोशिश कर रहा हूं लेकिन यह काम नहीं करता है। यह अन्य आदेशों के साथ काम करता है, लेकिन यह नहीं। यह बस आउटपुट फ़ाइल बनाता है जिसमें इसके अंदर कुछ भी नहीं है। - Nik-Lz
@ निक-एलजे अक्सर ऐसा इसलिए होता है क्योंकि कमांड अपने सभी आउटपुट को stderr पर भेज रहा है। यदि जीसीसी त्रुटि संदेश उत्पन्न कर रहा है, तो ऐसा लगता है। Stdout के बजाय stderr कैप्चर करने के लिए Slothworks टिप्पणी देखें। - Jonathan Hartley
एनबी: के उत्पादन प्राप्त करने के लिए make फ़ाइल में कमांड के लिए इसे इस वाक्यविन्यास की आवश्यकता होती है: make > someFile.txt 2>&1 (स्रोत: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
@ केलीब्रिडेनस्टीन देखें tee नीचे जवाब (askubuntu.com/a/485762/44179) - Seth♦


फ़ाइल में कमांड के आउटपुट को लिखने के लिए मूल रूप से 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

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


539
2018-02-08 14:52



टेबल के लिए धन्यवाद, यह बढ़िया है! यह शीर्ष जवाब होना चाहिए - DevShark
@ karthick87 यह वास्तव में किसी फ़ाइल को आउटपुट रीडायरेक्ट करने के बारे में प्रश्न से संबंधित नहीं है, क्योंकि यह सिर्फ एक स्ट्रीम को दूसरे पर रीडायरेक्ट करता है। 2>&1 STDERR को STDOUT पर रीडायरेक्ट करता है, 1>&2 STDOUT को STDERR पर रीडायरेक्ट करता है और 3>&1 धारा 3 को STDERR पर रीडायरेक्ट करेगा। - Byte Commander
सिर्फ एक नोट है कि '| &' मैकोज़ पर मेरे लिए काम नहीं कर रहा था। यह बैश का एक पुराना संस्करण होने के कारण है (मुझे लगता है)। कम सुरुचिपूर्ण '2> और 1 |' हालांकि ठीक काम करता है - Danny Parker
एन, वाई, वाई, वाई के बारे में क्या? - user1133275
@Jas दोनों stderr (2) और stdout (1) धाराओं को पुनर्निर्देशित करने के लिए। - Byte Commander


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

command | tee ~/outputfile.txt

एक मामूली संशोधन भी stderr पकड़ जाएगा:

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

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

command |& tee ~/outputfile.txt

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


81
2018-06-20 04:45



tee उपयोगी है अगर आप इसे लाइव देखने के दौरान कमांड आउटपुट कैप्चर करने में सक्षम होना चाहते हैं। इस लाइन को बनाओ साहसिक हारून। यह एक समय में दो नौकरियां करेगा। जवाब के लिए धन्यवाद। - learner
यह कहता है कि और अप्रत्याशित है, और उसी समय लॉग लिखता नहीं है जैसे कमांड चलता है। मैं इसे एक बैश फ़ाइल में उपयोग कर रहा हूं, क्या इससे कोई फर्क पड़ता है? - tim687
@ tim687 मैंने इसे संपादित कर दिया है। इसके बारे में क्षमा करें ... मेरे मूल उत्तर का हिस्सा नहीं था। - Aaron
@ आर्न धन्यवाद! टीई वास्तविक समय में फाइल को जोड़ देगा, है ना? मेरे पास एक बैकअप स्क्रिप्ट है जिसका उपयोग मैं अपने पीसी पर बैकअप लेता हूं, लेकिन लॉगिंग वास्तविक समय में नहीं है। बैकअप समाप्त होने के बाद मेरा पीसी सो जाता है, और लॉग फ़ाइल खाली है। क्या मुझे कमांड लॉग करने के लिए एक और कमांड का उपयोग करना चाहिए? - tim687
अरब धन्यवाद भाई - Mahesha999


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

your_command >/path/to/file

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

your_command >>/path/to/file

17
2018-02-14 19:52



आपका बहुत बहुत धन्यवाद ! क्या कोई सीमा है? फ़ाइल के अधिकतम आकार की तरह? - led-Zepp
अधिकतम फ़ाइल आकार फ़ाइल सिस्टम के माध्यम से बस सीमित है - chaos
यह जवाब stderr को बचाएगा नहीं। &> देखें, का प्रयोग करें stackoverflow.com/questions/637827/... तथा tldp.org/LDP/abs/html/io-redirection.html - Panther
ओपी ने कभी भी stderr को बचाने के लिए कहा नहीं - chaos


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

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

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

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

11
2017-07-08 20:57



आउटपुट को इस तरह से कैसे सहेजना है कि रंग संरक्षित हैं? मैं libreoffice में एक आदेश का परिणाम आयात करना और रंग रखना चाहते हैं। - madrang
@madrang: मैं केवल आपकी टिप्पणी पढ़ता हूं लेकिन आपको यह मिल सकता है उत्तर उपयोगी। - Sylvain Pineau
ओह, लगभग वही है जो मैं ढूंढ रहा हूं। आउटपुट स्क्रीन पर भी प्रिंट कैसे करें? - Sigur
ध्यान दें कि कई आदेश जो रंगीन आउटपुट का उत्पादन करते हैं, जैसे कि ls तथा grep, समर्थन --color=auto, जो मानक आउटपुट टर्मिनल है, केवल रंग कोड आउटपुट करता है। - Eliah Kagan


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

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

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


1
2018-04-11 12:25





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

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


उदाहरण:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

यह मानते हुए log.py शामिल हैं:

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

तुम दौड़ सकते हो unbuffer python log.py | tee command.log या unbuffer python log.py > command.log

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


0
2017-07-04 20:54



जब वे इसे प्राप्त करते हैं तो वे आउटपुट को सहेजते हैं, समस्या यह है कि जब आउटपुट टीटीवी नहीं होता है तो पाइथन बफरिंग चालू हो जाता है। पायथन में इसे अक्षम करने के लिए अन्य विकल्प: stackoverflow.com/q/107705/2072269 - muru