端末出力をファイルに保存するにはどうすればよいですか?

コマンドの出力をファイルに保存するにはどうすればよいですか?

ソフトウェアを使用せずに方法はありますか? 私はどのように知りたいと思います。

はい、それは可能です、ちょうど出力をリダイレクトします(別名 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

    標準出力ストリームはファイルにコピーされますが、端末ではまだ表示されます。 ファイルが既に存在する場合、新しいデータはファイルの末尾に追加されます。

  • (*)

    Bashには、StdErrのみを2番目のコマンドにパイプすることを可能にする速記構文はありません。 tee 再びテーブルを完成させる。 あなたが本当にそのようなものが必要な場合は、見てください "Stdoutではなくstderrをパイプする方法は?"スタックオーバーフローについて ストリームを交換したり、プロセス置換を使用したりすることによって、これをどのように行うことができるかについては、いくつかの方法があります。

  • command |& tee output.txt

    標準出力と標準エラーストリームの両方がファイルにコピーされますが、端末では表示されます。 ファイルが既に存在する場合は、上書きされます。

  • command |& tee -a output.txt

    標準出力と標準エラーストリームの両方がファイルにコピーされますが、端末では表示されます。 ファイルが既に存在する場合、新しいデータはファイルの末尾に追加されます。

また、以下を使用することもできます tee 出力をファイルに送信するには:

command | tee ~/outputfile.txt

わずかな変更はstderrもキャッチします:

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

ここには2つの異なる質問があります。 最初はタイトルにあります:

端末出力をファイルに保存するにはどうすればよいですか?

第二の質問は、体内にあります:

コマンドの出力をファイルに保存するにはどうすればよいですか?

ここに投稿されたすべての回答は2番目の質問に対応していますが、最初の質問には対応していません。 Unix&Amp;Linux:

この回答は、あまり知られていないコマンドを使用しています 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 あなたはBashの拡張機能を避けたいと思っています。 同等のPOSIX sh リダイレクト演算子は次のとおりです

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

POSIX機能はある意味ではより単純で簡単であることに気付くでしょう。 その &> 構文はから借用されました csh それはすでにそれが悪い考えであることをあなたに納得させるはずです。

some_command | tee command.logsome_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