ターミナル出力をファイルに保存するにはどうすればよいですか?


689

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

ソフトウェアを使用しない方法はありますか?方法を知りたいです。

回答:


736

はい、可能です。出力をファイルにリダイレクトするだけです。

SomeCommand > SomeFile.txt  

または、データを追加する場合:

SomeCommand >> SomeFile.txt

あなたがしたい場合stderrにも、これを使用します。

SomeCommand &> SomeFile.txt  

またはこれを追加する:

SomeCommand &>> SomeFile.txt  

コンソールファイルに両方stderrと出力を表示したい場合は、これを使用します:

SomeCommand 2>&1 | tee SomeFile.txt

(出力のみが必要な場合は、2上記をドロップします)


15
なおsomeCommand 2> someFile.txtsomeCommand 2>> someFile.txtもリダイレクトstterrsomeFile.txtに
Slothworks

これをgccコマンドで実行しようとしていますが、機能しません。他のコマンドでは機能しますが、これでは機能しません。内部に何もない出力ファイルを作成するだけです。
ニコス

@ Nik-Lz多くの場合、これはコマンドがすべての出力をstderrに送信しているためです。gccがエラーメッセージを生成している場合、これは可能性が高いようです。stdoutではなくstderrをキャプチャする方法については、Slothworksのコメントを参照してください。
ジョナサンハートリー

1
NB:makeコマンドの出力をファイルに取得するには、代わりに次の構文が必要です:(make > someFile.txt 2>&1ソース:linuxquestions.org/questions/linux-newbie-8/…
Gabriel Staples

ファイルが約8MBに達すると書き込みが停止するという問題があります。これは既知の制限ですか?
18年

865

コマンドの出力をファイルに書き込むには、基本的に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

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


66
テーブルをありがとう、それは素晴らしいです!これは、トップの答えでなければなりません
DevShark

3
@ karthick87これは、1つのストリームを別のストリームにリダイレクトするだけなので、出力をファイルにリダイレクトすることに関する質問とは実際には関係ありません。2>&1STDERRをSTDOUTに1>&2リダイレクトし、STDOUTをSTDERRに3>&1リダイレクトし、ストリーム3をSTDERRにリダイレクトします。
バイトコマンダー

18
macOSで「|&」が機能していなかったことに注意してください。これは、古いバージョンのbashがあるためです(私は思う)。あまりエレガントではない「2>&1 |」しかし正常に動作します
ダニー・パーカー

2
@ByteCommanderエラーが発生します:c9.ioサーバーのPythonスクリプトからsh: 1: Syntax error: "&" unexpected使用すると|& tee。別のシェルが使用されているようです。バージョン4.3.11(1)-releaseをecho $SHELL示し/bin/bashてい$SHELL --versionます。私#!/bin/bashは自分のPythonスクリプトで試しましたが、まだ取得しsh: 1: Syntax errorます。私はので、私は間のすごみをソートするにあきらめてる必要なものだshbash私のサーバー上で。ありがとう。
samkhan13

1
@ samkhan13は、あなたが実行しているように見えshないbash(または多分bashsh...モード)。信頼性が低く、ログインシェルが表示されるps -p $$ -o cmd=ため、現在のシェルプロセスが使用しているものを正確に確認echo $SHELLできます。別のサブシェルを開始したかどうかは無視されます。
バイトコマンダー

108

またtee、出力をファイルに送信するために使用できます。

command | tee ~/outputfile.txt

わずかな変更でもstderrがキャッチされます。

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

またはわずかに短く複雑ではありません:

command |& tee ~/outputfile.txt

teeコマンド出力キャプチャしながらライブで見たい場合に便利です。


&は予期しないものであり、コマンドの実行と同時にログを書き込むことはありません。私はこれをbashファイルで使用していますが、違いはありますか?
tim687

@ tim687その編集を削除しました。それについてすみません...私の元の答えの一部ではありませんでした。
アーロン

@アーロンありがとう!teeはリアルタイムでファイルを追加しますよね?PCをバックアップするために使用するバックアップスクリプトがありますが、ロギングはリアルタイムではありません。バックアップが完了した後、PCがスリープ状態になり、ログファイルが空になります。別のコマンドを使用してコマンドを記録する必要がありますか?
tim687

の意味をどのように解釈し2>&1ますか?
マヘシャ999

@ Mahesha999 2はSTDERRのファイル記述子であり、1はSTDOUTのファイル記述子です。したがって、2>&1はSTDERRをSTDOUTに送信します。このSO質問はかなりよく、それを説明する:stackoverflow.com/questions/818255/...
アーロン

20

コマンド出力をファイルにリダイレクトできます:

your_command >/path/to/file

コマンド出力を上書きする代わりにファイルに追加するには、次を使用します。

your_command >>/path/to/file

どうもありがとう !制限はありますか?ファイルの最大サイズのような?
led-Zepp

3
最大ファイルサイズはファイルシステムによって制限されているだけです
カオス

この答えはstderrを保存しません。&>を使用し、stackoverflow.com / questions
パンサー

3
OPはstderrを保存するように要求しませんでした
カオス

「そのようなファイルまたはディレクトリはありません」と表示されます。ディレクトリを自動的に作成することもできますか?
Qwerty

14

考慮すべき機能強化-

さまざまなスクリプトがカラーコードを出力に挿入しますが、ログファイルが乱雑になることは望ましくありません。

これを修正するには、sedプログラムを使用してこれらのコードを取り除きます。例:

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

1
色が保存されるように出力を保存する方法は?libreofficeでコマンドの結果をインポートし、色を維持したいと思います。
madrang

@madrang:私はあなたのコメントを今読んでいるだけですが、この答えは役に立つかもしれません。
シルヴァンピノー

ああ、ほぼ正確に私が探しているもの。出力を画面に印刷する方法は?
シグル

1
多くのコマンド色付け出力、など産生することに注意してくださいlsgrep、支持--color=auto標準出力が端末である場合にのみカラーコードを出力します。
エリアケイガン

5

以下のため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、すでにそれは悪いアイデアだことを納得させるべきです。


1

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

詳細:コマンド出力をファイルにリアルタイムで保存するにはどうすればよいですか?


受け取った出力を保存しますが、問題は、出力がTTYでない場合にPythonがバッファリングをオンにすることです。Pythonでこれを無効にする他のオプション:stackoverflow.com/q/107705/2072269
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.