コマンドの出力をファイルに保存するにはどうすればよいですか?
ソフトウェアを使用しない方法はありますか?方法を知りたいです。
はい、可能です。出力をファイルにリダイレクトするだけです。
SomeCommand > SomeFile.txt
または、データを追加する場合:
SomeCommand >> SomeFile.txt
必要に応じて stderr
を使用してください:
SomeCommand &> SomeFile.txt
またはこれを追加する:
SomeCommand &>> SomeFile.txt
stderr
と出力の両方が必要な場合ファイルにコンソールに表示されるand useこの:
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をパイプする方法?"をご覧ください。 on Stack Overflow いくつかの方法でこれを行う方法、たとえばストリームを交換するか、プロセス置換を使用します。
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
cron
ジョブなどの場合、Bash拡張機能を使用しないでください。同等のPOSIX sh
リダイレクト演算子は次のとおりです。
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
POSIXファシリティは、ある意味でよりシンプルでわかりやすいことがわかります。 &>
構文はcsh
から借用したものであり、これは悪い考えであることをすでに納得させるはずです。
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
を実行できます